【问题标题】:Why is the initial marking phase in CMS serial为什么CMS序列中的初始标记阶段
【发布时间】:2018-04-20 14:47:28
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    对于年轻空间使用“探测”(在某个时间间隔内,最后分配的对象的起始地址是记录器),但长期以来它仅在 CMS 的预清理阶段启用。

    2013 年,Hiroshi Yamauchi 向 OpenJDK 贡献了一个patch,它可以在 CMS 上启用并行初始标记。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2020-10-13
      • 1970-01-01
      • 2011-03-02
      相关资源
      最近更新 更多