java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java CMS和G1垃圾回收过程的异同

Java之CMS和G1垃圾回收过程的异同说明

作者:SnailMann

CMS垃圾回收器主要基于并发-清理算法,目的是减少停顿时间,通过四个主要阶段进行垃圾回收:初始标记、并发标记、重新标记和并发清理,G1垃圾回收器采用标记-整理算法,是JDK9后的默认垃圾收集器,设计为全功能全代收集器

CMS 和 G1 垃圾回收过程的异同

垃圾回收

CMS 垃圾回收

CMS 垃圾收集器是基于并发-清理(Mark-Sweep) 算法,以获取最短停顿时间为目标的垃圾收集器,是 JVM 第一款真正意义上的并发收集器。CMS 垃圾回收整体分为 4 个过程

初始标记(CMS initial mark)

并发标记 (CMS concurrent mark)

重新标记 (CMS remark)

并发清理 (CMS concurrent sweep)

CMS 会造成的问题

G1 垃圾回收

G1 垃圾收集器整体上采用标记-整理算法,细节上是一种复制算法,作为一种全功能全代的垃圾收集器,是 JDK9 之后的默认垃圾收集器,用于替代 CMS。垃圾回收的主要过程跟 CMS 一样,主要也是 4 个阶段

初始标记 (Inital Marking)

并发标记 (Concurrent Marking)

最终标记 (Final Marking)

筛选回收 (Live Data Counting And Evacuation)

注意解释

CMS, G1 针对三色标记漏标的策略

不管是 CMS 还是 G1, 都是采用三色标记算法来处理并发垃圾回收的问题,但对其可能会造成的漏标行为,却采用了不同的行为

增量更新策略

我的理解中,增量更新策略就类似在黑色对象引用白色对象的插入屏障中,记录这样一个信息,交给重新标记阶段去处理

SATB (snapshot-at-beginning)策略

我的理解是,SATB 同样是利用写屏障,只不过利用的是删除屏障,即在白色对象断开的时候,记录下原有的指向信息,因为它认为在一开始所记录的所有对象都要被扫描。同理交给最终标记阶段去处理

Golang 策略

G1 有什么优势?为什么可以替换 CMS ?

G1 的优势

G1 的缺点

替换场景

问题

CMS 初始标记为什么需要 STW ?

G1 筛选回收为什么需要 STW ?

在并发标记阶段,如果没有 STW, 新加入的对象要怎么处理?

新加入的对象有那么几种可能的情况

假设新加入对象分配为白色对象,那么就存在几个问题

不管怎么说,依然会存在新加入对象被当做垃圾回收掉的问题,所以新对象直接分配为白色对象是有问题的,我们要怎么处理才合理呢?

在不同的语言,不同的垃圾收集器,我猜测应该由不同的处理方式,这里可以列举一下

G1 到底使用什么垃圾回收算法?

网上通常说 G1 采用的是标记-整理算法,整体上也可以这么去理解

- 整体标记-整理,细节复制算法

- G1 会将需要回收的 region 中活跃的对象拷贝到空闲分区,然后将回收 region 进行清理,再归类为空闲分区,这一个过程像是标记整理,也像复制算法

G1 GC 与垃圾回收过程怎么混合理解?

G1 的并发标记阶段仅仅针对与老年代对象的分析,即我们在上面描述的垃圾回收阶段是针对 G1 老年代回收的,新生代回收相比以上更加的简单。全程 STW, GC 线程并行回收新生代对象

实际上 Mixed GC 就包含了 YGC 的整个过程,即如果发生了 Mixed GC, 那么之前必然发生了 YGC。我们可以简单的理解 YGC 的过程只有两个阶段 (初始标记,筛选回收)。而在初始标记过后,当堆内存的占用到达内存可用总量的 45% (可设置),就会触发并发标记阶, 此时就代表从 YGC 进阶到 Mixed GC, 之后就走正常的流程了

Mixed GC 的开始,基于 G1 YGC 的完成,并发标记过程由并发标记线程从 Survivor 区或老年代的 RSet 记录的活跃对象作为根并开始标记

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文