一文看懂JDK12中新版垃圾回收器-Shenandoah GC

Shenandoah GC是一款针对低停顿时间设计的垃圾收集器,采用并发和并行策略,以Brooks pointers实现。主要目标是99.9%停顿时间低于10ms,不依赖堆大小。它有6个并发阶段,包括并发标记、疏散、更新引用等,通过对象头的间接指针实现并发移动对象。适合超大内存场景,可能牺牲吞吐量,但能避免长时间停顿。在高分配速率下,可通过增大堆来优化。未来可能考虑分代收集以提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 简介

2. 流程

3. 实现

3.1. GC 前

3.2. GC 疏散阶段(Concurrent Evacuation)

3.3. GC 更新引用阶段(Concurrent Update References)

3.4. GC更新引用阶段(Final Update Refs )

4. 对象比较怎么办?

5. 适用场景

6. 性能对比

7. 大神猜测

8. 附1

8.1. 三色标记法


1. 简介

Shenandoah是一款concurrent及parallel的垃圾收集器;跟ZGC一样也是面向low-pause-time的垃圾收集器,不过ZGC是基于colored pointers来实现,而Shenandoah GC是基于brooks pointers来实现。

其实低停顿的GC,业界早就出现,只不过Java比较晚

Azul的Zing中C4 GC   土豪选择

oracle中的HotSpot ZGC    JDK11的选择

R大说ZGC说抄袭Azul的,两者是等价的。

不过今天主要是探究一下另一款追求低停顿时间的GC回收器Shenandoah GC

 

2. 流程

Shenandoah 主要目标是99.9%停顿小于10ms,暂停与堆大小无关

其工作流程如下图所示

GC(3) Pause Init Mark 0.771ms

GC(3) Concurrent marking 76480M->77212M(102400M) 633.213ms

GC(3) Pause Final Mark 1.821ms

GC(3) Concurrent cleanup 77224M->66592M(102400M) 3.112ms

GC(3) Concurrent evacuation 66592M->75640M(102400M) 405.312ms

GC(3) Pause Init Update Refs 0.084ms

GC(3) Concurrent update references  75700M->76424M(102400M) 354.341ms

GC(3) Pause Final Update Refs 0.409ms

GC(3) Concurrent cleanup 76244M->56620M(102400M) 12.242ms

上面的阶段大致如下

 

  1. Init Mark 启动并发标记。它为堆和应用程序线程准备并发标记,然后扫描根集。这是流程中的第一个暂停,最主要的消耗是根集扫描。因此,其持续时间取决于根集大小。
     
  2. Concurrent Marking 遍历堆,并跟踪可访问的对象(三色标记对象)。此阶段与应用程序一起运行,其持续时间取决于活动对象的数量和堆中对象关系的结构。由于应用程序可以在此阶段自由分配新数据,因此在并发标记期间堆占用率会上升。这里主要运用的是SATB(snapshot-at-the-beginning)
     
  3. Final Mark 通过清理所有等待的标记,更新队列,重新扫描根设置三个并发的来完成标记。(这里主要是处理一些SATB没有处理完的引用)它还通过确定要撤离的区域(收集集合),预先疏散一些根来初始化疏散,并且通常为下一阶段准备运行时间。这项工作的一部分可以在Concurrent Cleanup阶段同时完成。这是周期中的第二个暂停,这里消耗最主要的时间是清理队列并扫描根集。 
     
  4. Concurrent Cleanup 回收立即垃圾区域。 即在并发标记之后检测到的没有活动对象的区域。
     
  5. Concurrent Evacuation 将对象集合从集合集复制到其他区域。这是与其他OpenJDK GC的主要区别。此阶段再次与应用程序一起运行,因此应用程序可以自由分配。其持续时间取决于为流程选择的集合集的大小。
     
  6. Init Update Refs 初始化更新引用阶段。除了确保所有GC和应用程序线程都已完成疏散,然后为下一阶段准备GC之外,它几乎没有任何作用。这是周期中的第三次暂停,最短暂停。
     
  7. Concurrent Update References 遍历堆,并更新对并发撤离期间移动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值