【垃圾收集算法】常见的JVM垃圾收集算法

一、背景

  面试过程中经常被问到jvm垃圾收集算法相关的知识点,对这方面也在研究和学习,借此机会写一篇关于垃圾收集算法的文章并加深记忆。

二、可达性分析

   当前商用程序语言内存管理系统都是通过可达性分析算法判定对象存活的,基本思路就是通过一系列成为“GC Roots”的根对象作为起始节点集,从这些节点根据引用关系向下搜索,走过的路径称为“引用链”。

   可作为GC Roots的对象包括:虚拟机栈(栈帧中的本地变量表)中引用的对象,方法区中的类静态属性引用的对象,方法区中常量引用的对象,本地方法栈中JNI引用的对象,JVM内部的引用(基本数据类型对应的calss对象,异常对象,系统类加载器等),所有被同步锁持有的对象等。

三、垃圾收集算法

  1⃣️、标记-清除算法:最早也是最基础的垃圾收集算法,算法顾名思义分为标记和清除两阶段。首先标记存活的对象,然后统一回收所有未被标记的对象;也可以标记需要回收的对象,清除阶段清除掉被标记的对象。

         缺点:1、面对大量回收对象时执行效率低;2、内存空间的碎片化,清除后产生大量不连续的内存碎片。

  2⃣️、标记-复制算法:未解决标记清除算法面对大量回收对象时执行效率低的问题所提出,采用称为“半区复制”的收集算法,将可用内存分为大小相等的两块,当一块用完后,将存活对象复制到另一块,然后把已使用的内存空间一次清理掉。这种算法的缺点是当内存中多数对象为存活对象,则会增加复制所带来的内存开销,但当多数对象都是可回收对象时,复制的是少数存活对象,内存分配是也不用考虑空间碎片问题,简单高效。但是显而易见的是复制算法将可用内存缩小为原来的一半,空间浪费。

   鉴于新生代对象的“朝生夕死”的特点,基本98%的新生代对象在第一轮收集便被清理,从而优化出半区复制分代策略,hotspot的Serial、ParNew等新生代收集器采用此策略设计新生代内存布局。具体做法:将新生代分为较大的Eden和两块较小的Survivor区域,只使用Eded和其中的一块Survivor,垃圾收集时将存活的对象复制到另一块Survivor,清理Eden和使用过的Survivor区域,HotSpot默认Eden:Servivor比例为8:1,即使用90%的新生代,浪费10%。当Survivor空间不足以容纳一次Minor GC之后存活的对象时,需依赖其他区域进行分配担保,即“逃生门”设计策略,一般老年代作为担保。

  3⃣️、标记-整理算法:针对老年代的垃圾收集算法,过程类似标记-清除过程,不同的是最后清除阶段不是对可回收对象一次性清除,而是让存活对象向内存一端移动,然后直接清理掉边界以外的内存。

   移动存活对象是优缺点并存的策略,比如像老年代每次回收都有大量存活对象,移动对象并更新引用势必要暂停用户线程,我们称之为“Stop The World”,这就是其弊端之一。但如果不进行移动整理,则会有大量内存碎片,这样当没有足够大的连续空间分配对象时就会引起Minor GC,或依赖更复杂的内存分配器来解决。基于这两点,移动不移动对象都存在弊端,但从程序吞吐量来看,移动对象更划算,因为即使不移动对象收集器的效率高一些,内存分配的耗时也会增加,总吞吐量也是降低的。另外一种方案就是让虚拟机大多数采用标记-清除算法进行垃圾收集,允许内存碎片的存在,直到碎片影响到内存分配时再用标记-整理算法,CMS收集器就是采用这种处理方法。

以上是目前所使用的垃圾收集算法,写的不全,感兴趣的同学可网上查资料或相关书籍。另外可能有些人会提到“引用计数法”,在对象中添加一个计数器,每当引用对象的时候计数加一,引用失效是减一,计数为零的则是不被引用的对象,可以清理,虽然此算法占用了额外的内存空间用来计数,但是它原理简单判定效率高,但是!这里需注意,在java领域,起码主流的虚拟机里没有选用此算法来管理内存,至于原因大家不妨想一下,这种算法无法解决对象之间相互循环引用的问题,所以面试时还是不要说这个算法了,但是原理还是要清楚的对吧。好了,写到这里,写一篇我们来总结下主流的垃圾收集器,敬请关注!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值