JVM垃圾回收器

一.垃圾标记阶段
①引用技术算法
对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,即表示对象A不可能在被使用,可进行回收。
②可达性分析算法(跟搜索算法,追踪性垃圾收集)
1.可达性分析算法是根据对象集合为起始点,按照从上到下的方式搜索被根对象集合所连接的目标对象是否可达。
2.使用可达性算法后,内存中的存活对象都会被根对象集合直接或间接的连接着,搜索所走过的路径称为引用链。
3.如果目标对象没有任何引用链相连,则是不可达的,就意味者该对象已经死亡,可以标记为垃圾对象。
4.可达性分析算法中,只有能够被跟对象(GC Roots)集合直接或间接链接的对象才是存活对象。
二.垃圾清除阶段
①标记-清除算法(Mark-Sweep)
标记:Collector从引用根节点开始遍历,标记所有被引用对象。一般是对象的Header中记录为可达对象。
清除:Collector从堆内存中从头到尾进行线性遍历,如果发现某个对象在Header中没有标记为可达对象,则将其回收。
缺点:Ⅰ.效率不算高;Ⅱ.在进行GC的时候,需要停止整个应用程序,导致用户体验差;Ⅲ.这种方式清理出来的空闲内存是不连续的,产生内存碎片,需要维护一个空闲列表。
②复制算法(copying)
类似s0和s1区的原理将原来存活对象在新生成的一个区中复制一份,再把原来区中剩下的垃圾清除。
优点:不用标记之后再清除,实现简单,运行高效;复制过去之后保证空间的连续性,不会出现“碎片”问题。
缺点:需要两倍的空间内存,增加了复制之后地址变动所引起的指针维护问题。
③标记-压缩算法(Mark-Compact)
过程:第一阶段和标记清除算法一样,从根节点开始标记所有被引用的对象。第二阶段将所有的存活对象压缩到内存的一端,按顺序排放,之后,清理边界外的所有空间。
优点:消除了标记-清除算法中,内存区域分散的缺点。消除了复制算法中,内存减半的高额代价。
缺点:从效率上说要低于标记-整理算法,同样需要维护指着引用。移动过程中需要全程暂停用户应用程序。(STW)

分代收集算法:
根据新生代,老年代的不同特点来选择不同的垃圾回收算法。
年轻代区域相对于老年代较小,对象生命周期短,存活率低,回收频繁。使用复制算法效率最高,关于内存问题可以用s0,s1区的设计来进行缓解。
老年代的特点:区域较大,对象生命周期长,存活率高,回收不及年轻代频繁。一般用标记-清除或者是标记-整理算法来实现。

三.垃圾回收器
①Serial回收器:串行回收
Serial收集器作为HotSpot中Client模式下的默认新生代垃圾回收器。采用复制算法,串行回收和STW机制的方法执行内存回收。除了年轻代之外,Serial收集器还提供提供用于执行老年代垃圾收集的Serial Old 收集器。采用标记-压缩算法。
优势:与其他收集器的单线程比简单而高效。

②ParNew回收器:并行回收
ParNew收集器除了采用并行回收的方式执行内存回收外,两款垃圾收集器之间没有任何区别。在CPU多核的情况下效率比Serial收集器高。
③Parallel Scaverge回收器:吞吐量优先(并行回收)(JDK8默认)
高吞吐量则可以高效率的利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算二不需要太多的交互的任务。
Paraller收集器也提供了用于执行老年代垃圾收集的Paraller Old收集器,采用了标记-压缩算法,并行回收和STW机制。
④CMS回收器:低延迟(作用于老年代)
是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作。采用标记-清除算法,并且也会STW。
工作原理:
1.初始标记:执行STW机制,这个阶段的主要任务仅仅只是标记出GCRoots能直接关联到的对象,速度非常快。
2.并发标记:从GCRoots的直接关联对象开始遍历整个对象图的过程,这个过程耗时比较长,但是不需要停顿用户线程,与其他线程并发执行。
3.重新标记:修正并发标记期间,因用户程序继续运而导致标记产生变动的那一部分对象的标记记录,同样会STW,但时间比并发标记短。
4.并发清除:清理删除掉标记阶段判断的已经死亡的对象,释放内存空间,与用户线程并发执行。
由于最耗费时间的并发标记与并发清除阶段都不需要暂停工作,所以整体的回收是低延迟的。
弊端:无法处理浮动垃圾:即并发清除阶段如果产生新的垃圾对象,CMS将无法对这些垃圾对象进行标记,最终会导致这些新产生的垃圾对象没有被及时回收。
⑤G1回收器:(区域分代化)
一款面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器。是JDK9以后的默认垃圾回收器。
将堆空间分为若干个区域(Region),这些区域中包含了逻辑上的年轻代和老年代,呵呵之前的各类回收器不同,它同时兼顾年轻代和老年代。
具体执行过程略😀

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值