从原理聊JVM(三):详解现代垃圾回收器Shenandoah和ZGC

💡 原文中文,约6500字,阅读约需16分钟。
📝

内容提要

ZGC是Java虚拟机中的一种垃圾回收器,支持TB级内存、停顿控制在10ms以内、对程序吞吐量影响小于15%。采用染色指针实现并发回收,使用读屏障保证访问正确转发。没有分代,采用分区域的堆内存布局,Region可以动态创建销毁和调整容量。采用虚拟内存映射技术和NUMA架构优化性能。运行步骤包括并发标记、并发预备重分配、并发重分配和并发重映射。

🎯

关键要点

  • Shenandoah是Java虚拟机中的一种垃圾回收器,首次出现在Open JDK12中,由Red Hat开发。

  • Shenandoah的设计目标是将停顿压缩到10ms级别,且与堆大小无关。

  • Shenandoah与G1有三点主要区别:实现并发回收、不区分年轻代和年老代、使用连接矩阵替代卡表。

  • 连接矩阵优化了G1中的卡表问题,通过二维表格标记Region之间的引用关系。

  • 转发指针用于实现并发回收,减少了用户线程访问新对象的开销。

  • 转发指针存在线程安全和高频访问性能问题,Shenandoah通过CAS操作和屏障优化来解决。

  • Shenandoah的运行步骤包括初始标记、并发标记、最终标记、并发清理、并发回收、引用更新等。

  • ZGC是Oracle研发的垃圾回收器,设计目标是支持TB级内存、停顿控制在10ms以内、对程序吞吐量影响小于15%。

  • ZGC的内存布局采用分区域的堆内存布局,Region可以动态创建和销毁。

  • ZGC使用重分配集来判定需要回收的Region,省去卡表的维护。

  • ZGC采用染色指针技术实现并发回收,通过指针标记对象的存活状态。

  • 染色指针提供自愈能力,允许在对象被清除后立即回收,而无需等待修正所有引用。

  • ZGC使用虚拟内存映射技术解决操作系统和处理器对指针修改的支持问题。

  • ZGC没有分代设计,整体GC效率还有提升空间。

  • ZGC的运行步骤包括并发标记、并发预备重分配、并发重分配、并发重映射等。

  • 现代垃圾回收器通过并发技术实现低停顿,Shenandoah和ZGC各有优化手段,提升Java开发体验。

➡️

继续阅读