ZGC如何在不使用写障碍的情况下进行并发标记?

时间:2019-10-31 09:54:19

标签: java garbage-collection

最近我读了一些有关ZGC的文章。
例如。 https://dinfuehr.github.io/blog/a-first-look-into-zgc/
它说ZGC中没有写障碍。

  

在堆中读写都是非常普遍的,因此两个GC屏障都需要超级高效。这意味着在通常情况下仅需要一些汇编说明。读屏障比写屏障的可能性高一个数量级(尽管它肯定会因应用程序而异),因此,读屏障对性能更加敏感。例如,世代GC通常只需要写障碍,而无需读障碍。 ZGC需要读取屏障,但没有写入屏障。对于并发压缩,我没有看到没有读取障碍的解决方案。

写屏障不需要并发压缩,但是它如何在没有写屏障的情况下进行并发标记呢?一些收集器(例如G1)使用三色标记和SATB +写屏障来进行并发标记。

我从OJ那里读到另一种方法:

  

另一种方法是将所有可能违反不变式的更改保持在队列中,然后在主阶段完成后运行第二个“修复”阶段。不同的收集器可以根据标准(例如性能或所需的锁定量)以不同的方式使用三色标记解决此问题。

我不知道它是如何工作的。搜索了一会儿之后,关于它的信息很少。(也许我应该阅读一些源代码。...

1 个答案:

答案 0 :(得分:0)

据我所知,写障碍没有必要,因为来自重定位集的根引用在并发重定位之前在STW阶段进行处理。因此,您将永远不会从堆栈,局部变量等中引用旧对象。