【发布时间】:2018-04-20 14:47:28
【问题描述】:
目前我正在尝试扩展我对 GC 算法的了解。我现在无法理解的是为什么 CMS GC 的第一阶段——初始标记——到处都显示为串行线程。 为什么不像 remarkin 阶段那样并行完成,这也是一个 STW?
提前感谢您的帮助。
【问题讨论】:
标签: java garbage-collection content-management-system phase
目前我正在尝试扩展我对 GC 算法的了解。我现在无法理解的是为什么 CMS GC 的第一阶段——初始标记——到处都显示为串行线程。 为什么不像 remarkin 阶段那样并行完成,这也是一个 STW?
提前感谢您的帮助。
【问题讨论】:
标签: java garbage-collection content-management-system phase
初始标记期间的大部分工作是扫描年轻空间以查找年轻到老的引用(从老空间的角度来看,它们是 GC 根)。
这项工作可以通过将内存分割成块以进行并行处理来并行化。虽然拆分内存需要 JVM 跟踪内存区域中对象第一个字节的确切地址,因为无法从对象中间的地址解析内存。
对于旧空间,这是通过跟踪数组中内存页面中第一个对象的偏移量来解决的(页面为 512 字节)。
对于年轻空间使用“探测”(在某个时间间隔内,最后分配的对象的起始地址是记录器),但长期以来它仅在 CMS 的预清理阶段启用。
2013 年,Hiroshi Yamauchi 向 OpenJDK 贡献了一个patch,它可以在 CMS 上启用并行初始标记。
现在初始标记实际上是平行的。
【讨论】: