目前,我正在尝试扩展有关GC算法的知识。我现在不明白的是,为什么CMS GC的第一阶段-初始标记-在任何地方都显示为串行线程。
为什么不像remarkin阶段(也是STW)那样并行完成?

预先感谢您的帮助。

最佳答案

初始标记期间的大部分工作是扫描年轻空间以查找年轻到旧的引用(从旧空间的角度来看它们是GC根)。

可以通过将内存拆分为多个块进行并行处理来并行化该工作。尽管拆分内存需要JVM跟踪内存区域中对象第一个字节的确切地址,因为无法从对象中间的地址解析内存。

对于旧空间,这可以通过跟踪数组中内存页面(页面为512字节)中第一个对象的偏移量来解决。

对于年轻空间,使用“探测”(在某个时间间隔内,最后分配的对象的起始地址是记录器),但是很长一段时间,仅在CMS的预清理阶段启用了它。

在2013年,山内浩史(Hiroshi Yamauchi)为OpenJDK贡献了一个patch,它可以在CMS上实现并行初始标记。

初始标记现在实际上是平行的。

10-04 17:26