为什么CMS序列中的初始标记阶段

时间:2018-04-20 14:47:29

标签: java garbage-collection content-management-system phase

目前我正试图扩展我对GC算法的了解。我现在能理解的是,为什么CMS GC的第一阶段 - 初始标记 - 随处显示为串行线程。 为什么它不是像remarkin阶段那样并行完成的,这也是一个STW?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

初始标记期间的大部分工作是扫描年轻空间的年轻人参考(从旧空间的角度来看,它们是GC根源)。

通过拆分内存以扫描成块以进行并行处理,可以并行化这项工作。虽然拆分内存需要JVM跟踪内存区域中对象第一个字节的精确地址,因为无法从对象中间的地址解析内存。

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

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

2013年,Hiroshi Yamauchi向OpenJDK提供patch,在CMS上启用并行初始标记。

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