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


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


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

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


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


我不知道它是如何工作的...搜索了一会儿之后几乎没有任何信息...(也许我应该阅读一些源代码....

最佳答案

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

关于java - ZGC如何在不使用写障碍的情况下进行并发标记?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58640689/

10-12 05:30