JVM垃圾回收算法

news2025/1/14 0:50:45

Java有着自己一套的内存管理机制,不需要开发者去手动释放内存,开发者只需要写好代码即可,运行过程中产生的垃圾都由JVM回收。那JVM都是用哪些算法进行垃圾回收呢?

标记-清除(Mark-Sweep)算法

标记-清除(Mark-Sweep)算法是最早出现也是最基础的垃圾收集算法。顾名思义,标记-清除算法分为两个阶段:

  • 标记:标记出所有需要回收的对象
  • 清除:清除掉所有被标记的对象

标记-清除前后

优点:

  • 简单,容易理解
  • 垃圾少时,效率高

缺点:

  • 会产生内存空间碎片,内存空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作
  • 性能不稳定,如果内存中大部分都是要回收的垃圾对象,标记和清除效率会随着垃圾的数量而降低

复制(Copying)算法

为了解决标记-清除算法面对大量可回收对象时执行效率低的问题,于是有了复制(Copying)算法。复制算法是将内存一分为二,当一块内存使用完成之后,会将存活的对象移动到另一块预留未使用的内存空间,然后将使用过的那块内存空间清理掉。

复制前后

优点:

  • 实现简单,运行高效
  • 不会产生内存空间碎片

缺点:

  • 因为要预留一半内存空间,所以内存空间浪费严重
  • 如果内存中多数对象都是存活的,这种算法将会产生大量的内存间复制的开销

Appel 式回收

在1989年,Andrew Appel针对具备“朝生夕灭”特点的对象,提出了一种更优化的半区复制分代策略,现在称为“Appel式回收”。具体做法是分配一块较大的Eden区和两块较小的Survivor区(可以叫做From区和To区,也可以叫做Survivor1区和Survivor2区)。

Img

研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块 Survivor空间。当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和已经用过的Survivor空间。也就是说,浪费的空间只有一个Survivor空间。

HotSpot虚拟机新生代比例Eden和Survivor空间比例为8:1:1,在使用的时候只使用Eden区和一个Survivor区,也就是说,新生代有90%的空间是在使用的,只有10%的空间是浪费的。新生代中98%的对象可被回收仅仅是“普通场景”下测得的数据,任何人都没有办法百分百保证每次回收都只有不多于10%的对象存活,因此,在Survivor空间不足的情况下,就需要依赖其他内存进行分配担保(Handle Promotion),一般是老年代。就是说如果Survivor空间不足,对象就需要以分配担保的形式进入老年代。

标记-整理(Mark-Compact)算法

标记-整理算法首先标记出所有需要回收的对象,在标记完成后,后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

标记-整理前后

优点:

  • 不会产生内存空间碎片
  • 相较于复制算法,不会有多余空间浪费

缺点:

  • 需要移动对象,效率低。对象移动不单单会加重系统负担,同时需要全程暂停用户线程才能进行,也就是常说的“Stop The World”,同时所有引用对象的地方都需要更新。

标记整理与标记清除算法的区别主要也在于对象的移动。

总结

垃圾回收算法没有好坏之分,只是应用场景不同。老年代存活对象比较多,所以一般采用标记-清除和标记-整理算法,相反,新生代存活对象比较少,所以一般采用复制算法。根据不同的区域的特征采用不同的算法,这就是分代收集理论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式 ID 生成系统 Leaf 的设计思路,源码解读

什么是分布式ID? ID 最大的特点是 唯一 而分布式 ID,就是指分布式系统下的 ID,它是 全局唯一 的。 为啥需要分布式ID呢? 这就和 唯一 息息相关了。 比如我们用 MySQL 存储数据,一开始数据量不大,但是业…

别再纠结线程池大小 + 线程数量了,没有固定公式的

可能很多人都看到过一个线程数设置的理论: CPU 密集型的程序 - 核心数 1I/O 密集型的程序 - 核心数 * 2 不会吧,不会吧,真的有人按照这个理论规划线程数? 线程数和CPU利用率的小测试 抛开一些操作系统,计算机原理不…

水资源税取水计量监管系统 取用水户水量在线监测平台 水资源远程实时监控管理系统

平升电子水资源税取水计量监管系统/取用水户水量在线监测平台/水资源远程实时监控管理系统适用于水资源管理部门对地下水和地表水的用水量、水位、水质进行监测,还可扩展远程或自动控制泵/闸/阀实现用水量控制。系统帮助管理部门掌握所辖区域内水资源取用水情况&…

打电话用蓝牙耳机什么牌子好?打电话清晰的蓝牙耳机推荐

随着蓝牙耳机的普及,我们可以享受到沉浸式的音乐。在不打扰任何人的情况下,尽情的享受,使用蓝牙耳机有时候避免不了来电,为了保证通话的清晰,许多人在选购的时候也会更加的看重麦克风,下面小编整理了几款打…

如何使用JMeter操作Elasticsearch

JMeter是Apache组织基于Java开发的压力测试工具,用于对软件做压力测试,Elasticsearch是一个分布式、高扩展、高实时的搜索与数据分析引擎(简称ES),下面来展示最基本的用JMeter操作ES示例。 打开JMeter工具,在测试计划下添加“线程…

【金万维】使用天联高级版登录U8,进行凭证打印操作。

【操作步骤】 通过“天联高级版客户端”登录 U8,打印凭证步骤: 第一步:首先查看一下天联高级版客户端的打印参数是否如下图所示。 (一般软件初次安装后,默认即可。) 第二步:进入U8后&#xff0…

web概述20

MVC模式 MVC全名是Model View Controller是模型视图控制器的缩写,是一种软件设计典范,是一种架构型的模式,本身不引入新功能,只是帮助将开发的结构组织的更加合理。 它使用一种业务逻辑、数据、界面显示分离的方法,将…

麦芽糖-聚乙二醇-顺铂 cisplatin-PEG-maltose

麦芽糖-聚乙二醇-顺铂 cisplatin-PEG-maltose 中文名称:麦芽糖-顺铂 英文名称:maltose-cisplatin 别称:生物素修饰麦芽糖 生物素-麦芽糖 麦芽糖-聚乙二醇-顺铂 cisplatin-PEG-maltose 顺铂-PEG-麦芽糖 纯度:95% 存储条件…

电动车充电费到了涨价的时候了,低能源使用成本正在成为过去

电动汽车以省钱成为各个新能源汽车企业吹嘘的宣传点,然而电动汽车车主如今正面临公共充电桩短缺的问题,公共充电桩的建设跟不上电动汽车增长的速度,导致电动汽车车主充电难问题日益突出,解决这个问题就只能通过涨价来解决供应短缺…

ln命令应用

记录:352 场景:在CentOS 7.9操作系统上,使用ln命令创建软链接(symbolic links)和硬链接(hard links)。解决:Too many levels of symbolic links。 版本: 操作系统:CentOS 7.9 1.命令应用 (1)目录创建软…

mybatis-plus,sgg,杨bochao,p5完成

一 MyBatis-Plus简介 增强工具。只做增强不做改。 可以直接在mybatis的基础上整合mybatis-plus。此时并不会影响mybatis的功能,即mybatis原来的功能都在,该怎么用还怎么用。锦上添花的是还能使用mybatis-plus提供的:通用的mapper、通用的ser…

drone+github实现自动化部署

目录drone简介drone与jenkins对比创建oauth2服务器安装drone生成drone的共享密钥配置drone.yml文件安装drone项目配置配置Dockefile配置.drone.yml文件配置阿里云镜像拉取文件drone简介 drone与jenkins对比 创建oauth2 在github中设置第三方app配置。 需要记住id…

[附源码]Python计算机毕业设计Django车源后台管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

微信截图无法发送,也发不出电脑上的图片

微信截图无法发送,也发不出电脑上的图片 现象 今天微信突然出现这个问题,怎么改设置都调不好,卸载重装都不行,最后发现,微信的消息目录中,一些文件无法删除,提示“文件或目录损坏且无法读取”…

上市公司排污费2010-2020重污染行业环境披露水平-原始数据及计算结果

一、重污染行业环境信息披露水平 1、数据来源:见附件 2、时间跨度:2009-2020 3、区域范围:重污染行业的认定主要依据环境保护部2008年6月发布的《上市公司环保核查行业分类管理名录》(环办函[2008]373号)、《上市公…

PDF转TXT怎么转?看完这篇你就会了

我们在学习工作的时候,经常会使用PDF格式来传输文件,因为PDF具有较强的格式稳定性。可是有时候我们也需要将PDF转成TXT格式,因为有些电子书阅读器比较适合阅读TXT格式的文件。那你们知道PDF怎么转TXT吗?有需要转换PDF格式的小伙伴…

Apollo 应用与源码分析:Monitor监控-软件监控-进程存活监控-process_monitor

目录 流程 代码 分析 获取可以运行的进程的信息 检查HMI 的模块信息 检查被监控的组件 检查其他组件 判断进程状态UpdateStatus 流程 代码 class ProcessMonitor : public RecurrentRunner {public:ProcessMonitor();void RunOnce(const double current_time) overrid…

BUUCTF Misc 被劫持的神秘礼物 刷新过的图片 [BJDCTF2020]认真你就输了 [BJDCTF2020]藏藏藏

被劫持的神秘礼物 下载文件 提示让我们找账号密码 wireshark打开上述文件 可以发现一个POST请求登录接口的HTTP包,追踪http流 数据包中可以发现用户名:admina 密码:adminb 打开md5在线加密 得到flag flag{1d240aafe2…

第二证券|新能源优势突出 青海加速储能产业布局

大唐青海动力开发有限公司工作人员在青海省海南藏族自治州共和县塔拉滩光伏电站巡检。 无论是新动力场站直流侧的储能技能应用,还是同享储能形式试点,近年来,青海储能职业迎来跨越式展开新阶段。业内遍及看好未来储能展开,作为全…

多线程(2)

文章目录前言 :1.Thread类 :1.1 Thread类常见的构造方法1.2 Thread的几个常见属性1.3 中断一个线程1.4 等待一个线程-join()1.5 获取当前线程引用1.6 休眠当前线程2.线程状态前言 : 简单回顾上文知识点 上文我们了解了 线程是为解决并发编程引…