目前我正试图扩展我对GC算法的了解。我现在能理解的是,为什么CMS GC的第一阶段 - 初始标记 - 随处显示为串行线程。 为什么它不是像remarkin阶段那样并行完成的,这也是一个STW?
提前感谢您的帮助。
答案 0 :(得分:1)
初始标记期间的大部分工作是扫描年轻空间的年轻人参考(从旧空间的角度来看,它们是GC根源)。
通过拆分内存以扫描成块以进行并行处理,可以并行化这项工作。虽然拆分内存需要JVM跟踪内存区域中对象第一个字节的精确地址,因为无法从对象中间的地址解析内存。
对于旧空间,这可以通过跟踪数组内存页中第一个对象的偏移量来解决(页面为512字节)。
对于年轻的空间"探测"使用(在某个时间间隔内,最后一个分配对象的起始地址是记录器),但很长一段时间它只在CMS的预清洁阶段启用。
2013年,Hiroshi Yamauchi向OpenJDK提供patch,在CMS上启用并行初始标记。
初始标记现在实际上是平行的。