为什么CMS中的初始标记阶段是连续的
Why is the initial marking phase in CMS serial
目前我正在尝试扩展我对 GC 算法的了解。我现在无法理解的是,为什么 CMS GC 的第一阶段 - 初始标记 - 到处都显示为串行线程。
为什么它不像 remarkin 阶段那样并行完成,这也是一个 STW?
提前感谢您的帮助。
初始标记期间的大部分工作是扫描年轻 space 以寻找年轻到年老的引用(从旧 space 的角度来看它们是 GC 根)。
这项工作可以通过拆分内存以扫描成块进行并行处理来并行化。尽管拆分内存需要 JVM 跟踪内存区域中对象第一个字节的确切地址,因为无法从对象中间的地址解析内存。
对于旧的space,这是通过跟踪数组内存页中第一个对象的偏移量(页为 512 字节)来解决的。
年轻时使用space "probing"(在某些时间段,最后分配对象的起始地址是记录器),但很长一段时间只在CMS的preclean阶段启用。
2013 年,Hiroshi Yamauchi 为 OpenJDK 贡献了一个 patch,它在 CMS 上启用了并行初始标记。
初始标记现在实际上是平行的。
目前我正在尝试扩展我对 GC 算法的了解。我现在无法理解的是,为什么 CMS GC 的第一阶段 - 初始标记 - 到处都显示为串行线程。 为什么它不像 remarkin 阶段那样并行完成,这也是一个 STW?
提前感谢您的帮助。
初始标记期间的大部分工作是扫描年轻 space 以寻找年轻到年老的引用(从旧 space 的角度来看它们是 GC 根)。
这项工作可以通过拆分内存以扫描成块进行并行处理来并行化。尽管拆分内存需要 JVM 跟踪内存区域中对象第一个字节的确切地址,因为无法从对象中间的地址解析内存。
对于旧的space,这是通过跟踪数组内存页中第一个对象的偏移量(页为 512 字节)来解决的。
年轻时使用space "probing"(在某些时间段,最后分配对象的起始地址是记录器),但很长一段时间只在CMS的preclean阶段启用。
2013 年,Hiroshi Yamauchi 为 OpenJDK 贡献了一个 patch,它在 CMS 上启用了并行初始标记。
初始标记现在实际上是平行的。