Shenandoah收集器

355 阅读3分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」。

低延迟垃圾收集器

内存占用、吞吐量和延迟是衡量垃圾收集器的三项重要的指标,三者共同构成了一个不可能三角。三者总体表现会随着技术越来越好,但是却不能三者都变的完美,然而在这三者中延迟这项指标变的越来越重要。

在这么多垃圾收集器中ShenandoahZGC在整个过程中基本上都是并发的,只有初始标记最终标记这些阶段有短暂停顿,因为停顿时间很小,所以这些垃圾收集器被称为低延迟垃圾收集器

Shenandoah收集器

Shenandoah收集器是一款由RedHat公司独立发展的新型收集器项目,该项目以及贡献给了OpenJDK,该项目的目标是实现一种能在任何堆内存大小都可以把垃圾收集器停顿限制在十毫秒内的垃圾收集器,也就是说它需要实现并发的垃圾标记以及并发的实现垃圾清除

Shenandoah基于Region堆内存布局并默认优先回收价值最大的Region。此外其支持并发整理算法,该垃圾收集器默认不使用分代收集而且摒弃了G1中的记忆集,而改用连接矩阵的全局数据结构来进行存储跨Region的引用关系,降低了处理跨代指针时的记忆集维护消耗,降低了伪共享问题的发生概率。

Shenandoah收集器工作流程

该垃圾收集器的工作流程大致可以分为九个阶段:

初始标记:首选项标记与GC Root直接关联的对象。该阶段会有短暂暂停

并发标记:遍历对象图,标记出全部可达对象,

最终标记:处理剩余原始快照扫描,在这个阶段回收价值最高的Region,该阶段会有短暂暂停。

并发清理:这个阶段用于清理整个区域内一个存活对象都没有达到的Region。

并发回收:该阶段要把回收集的存活对象复制到其他未使用的Region之中。

初始引用更新:并发回收阶段结束后需要把堆中所有指向旧对象的引用修正到复制后的地址。该阶段会产生一个短暂的暂停。

并发引用更新:真正开始进行引用更新操作,该阶段是和用户进程并发进行的。

最终引用更新:解决堆中的引用更新后,还要修正存在于GC Roots中的引用。这个阶段是Shenandoaah的最后一次停顿。

并发清理:上述操作已经没有存活的Region对象,再调用一次并发清理回收内存空间。