有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么CMS中的初始标记阶段是串行的

目前,我正试图扩展我对GC算法的知识。我现在无法理解的是,为什么CMS GC的第一阶段——初始标记——到处显示为串行线程。 为什么不像remarkin阶段那样并行进行,这也是一个STW

提前谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

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

    这项工作可以通过将内存分割成块进行并行处理来实现并行化。虽然分割内存要求JVM跟踪内存区域中对象第一字节的精确地址,因为内存不能从对象中间的地址解析。p>

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

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

    2013年,山内浩史(Hiroshi Yamauchi)向OpenJDK提供了一个patch,它支持CMS上的并行初始标记

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