虚拟机垃圾回收算法

1.标记-清除算法(最基础的垃圾收集算法):

标记-清除算法如同他的名字,分为标记和清除两个阶段,首先通过引用计数算法和可达性分析算法标记处所有需要回收的对象,然后进行垃圾回收。之所以说是最基础的收集算法,是因为后续的所有垃圾回收算法都是基于该算法进行改进和优化的。他有两个不足之处:一是效率问题,标记和清除两个阶段过程的效率都不是很高;另一个不足之处就是空间问题,由该算法进行垃圾回收后的内存会有大量不连续的内存碎片,这样导致后面的程序运行的时候如果有大对象就无法进行内存分配。
在这里插入图片描述

					标记-算法示意图

2.复制算法

将可用内存按照容量分为大小相等的两部分,每次只用其中的一部分,当这一块内存用完了就会把还存活的对象复制到另外一块内存中去,然后把这块内存中所有可回收的垃圾一次新全部清理掉,这样每次只对其中一部分内存进行垃圾回收处理,这样就不用考虑内存碎片的问题了,只需要移动堆顶指针按顺序分配内存即可。运行高效,但是这样的缺点就是对于内存的利用率会降低到原来的一半,复制算法的的执行过程如图所示:
在这里插入图片描述
现代商业虚拟机中都采用这种回收算法来回收新生代内存,IBM研究表明新生代中的对象98%都是“朝生夕死”,所以不需要按1:1的比列来划分内存空间,而是分为三块空间,一块较大的Eden和两块较小的Survivor(S0(from) 和S1(To)),新生对象放在Eden和S0区域,当Minor GC回收垃圾时,会将Eden区中完全存活的对象复制到S1,S0区存活的对象会根据他的年龄决定他的去向,每复制一次年龄就会加1,然后回收掉Eden和S0区的对象,多次复制仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被在S区继续进行复制。虚拟机Hotspot中默认Eden区和S区为8:1,所以每次新生对象的使用率为90%(Eden+S0)只有10%的空间会被浪费,当然98%可回收只是一般场景,不能保证每次回收都有少于10%的对象存活,如果超过10%的对象存活而且还没有到18岁,就需要老年代来分担对象存储的工作了。

3.标记整理算法

当采用复制算法时,如果对象的存活率较高,就会进行多次复制的过程,这样就会降低效率,如果 不想浪费一半的空间,就需要有额外的空间来分担,以应对内存空间中所有对象都存活的极端情况,所以老年代不能直接使用复制算法,就有人提出了另外一种算法标记-整理回收算法,该算法和标记-清除算法比较相似,不一样的地方就是在于标记完不是直接回收,而是让所有存活的对象向一端移动,然后回收掉所有段边界以外的可回收对象,标记-整理算法图如下:
在这里插入图片描述

4.分代收集算法:

当前虚拟机中使用的垃圾回收算法都是“分代回收算法”,这种算法就是根据对象的存活率不同将java堆内存划分为新生代和老年代,由于新生代的对象存活率极低,多采用复制算法进行垃圾回收,而老年代的对象存活率较高,并且没有额外的空间进行内存分担,就必须使用“标记-清除”或“标记-清理”的算法进行垃圾回收;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值