最近我读了一些关于ZGC的文章。
例如:https://dinfuehr.github.io/blog/a-first-look-into-zgc/
它说在ZGC中没有写障碍。
在堆中的读写都是非常常见的,因此这两个GC屏障都需要非常高效。这意味着在普通情况下只需要几个组装指令。读屏障比写屏障更有可能(尽管这取决于应用程序的不同),所以读屏障对性能更加敏感。例如,代际GC通常只需要一个写屏障,不需要读障碍。ZGC需要一个读屏障,但不需要写屏障。对于并发压缩,我还没有看到没有读障碍的解决方案。
写屏障不需要并发紧凑,但是它如何在没有写屏障的情况下做并发标记呢?一些收集器,如G1,使用三色标记和SATB+write屏障来进行并发标记.
我从OJ那里读到了另一种方法:
的另一种方法是保持一个队列,列出所有可能违背不变条件的更改,然后在主阶段完成后运行第二个“修复”阶段。不同的收集器可以根据性能或所需锁定量等标准,以不同的方式解决这个问题。
我想知道它是怎么工作的..。在搜索了一段时间之后,几乎没有关于它的信息.(也许我应该读一些源代码.
发布于 2020-03-02 05:22:28
据我所知,没有必要设置写屏障,因为来自重新定位集的根引用是在并发重新定位之前在STW阶段处理的。因此,您将永远不会从堆栈、局部变量等引用旧对象。
发布于 2022-01-11 09:30:22
我不认为它和ZGC有很强的关系,你应该知道三色标记
以下是我个人的理解,我不能保证正确,因为我是新来的GC。
失踪条件:
以上条件可以抽象为
var whiteObj = getWhiteObj() // read operate ①
grayObj.whiteObj = null // write opt ②
blackObJ.XX = whiteObj // write opt ③对于上述代码,有三种方法可以实现并行标记中的目标丢失问题。
1:阅读屏障(也就是说,您需要的,目前由ZGC使用)
当发生1时,记录whiteObj,在下一阶段(最后标记),这些记录的对象被遍历一次。
2和3都是写障碍,分别通过增量更新和表表实现。这不是你需要的。如果你感兴趣,我相信有一个比我更好的解释,在三色标记博客。
https://stackoverflow.com/questions/58640689
复制相似问题