首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZGC如何在不使用写屏障的情况下做并发标记?

ZGC如何在不使用写屏障的情况下做并发标记?
EN

Stack Overflow用户
提问于 2019-10-31 09:54:19
回答 2查看 297关注 0票数 1

最近我读了一些关于ZGC的文章。

例如:https://dinfuehr.github.io/blog/a-first-look-into-zgc/

它说在ZGC中没有写障碍。

在堆中的读写都是非常常见的,因此这两个GC屏障都需要非常高效。这意味着在普通情况下只需要几个组装指令。读屏障比写屏障更有可能(尽管这取决于应用程序的不同),所以读屏障对性能更加敏感。例如,代际GC通常只需要一个写屏障,不需要读障碍。ZGC需要一个读屏障,但不需要写屏障。对于并发压缩,我还没有看到没有读障碍的解决方案。

写屏障不需要并发紧凑,但是它如何在没有写屏障的情况下做并发标记呢?一些收集器,如G1,使用三色标记和SATB+write屏障来进行并发标记.

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

的另一种方法是保持一个队列,列出所有可能违背不变条件的更改,然后在主阶段完成后运行第二个“修复”阶段。不同的收集器可以根据性能或所需锁定量等标准,以不同的方式解决这个问题。

我想知道它是怎么工作的..。在搜索了一段时间之后,几乎没有关于它的信息.(也许我应该读一些源代码.

EN

回答 2

Stack Overflow用户

发布于 2020-03-02 05:22:28

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

票数 0
EN

Stack Overflow用户

发布于 2022-01-11 09:30:22

我不认为它和ZGC有很强的关系,你应该知道三色标记

以下是我个人的理解,我不能保证正确,因为我是新来的GC。

失踪条件:

  • 灰色对象与白色对象
  • 断开连接黑色对象创建到白色对象的新连接( web上有GIF,但我不知道如何上传图片)

以上条件可以抽象为

代码语言:javascript
复制
var whiteObj = getWhiteObj() // read operate ①
grayObj.whiteObj = null // write opt ②
blackObJ.XX = whiteObj // write opt ③

对于上述代码,有三种方法可以实现并行标记中的目标丢失问题。

1:阅读屏障(也就是说,您需要的,目前由ZGC使用)

当发生1时,记录whiteObj,在下一阶段(最后标记),这些记录的对象被遍历一次。

2和3都是写障碍,分别通过增量更新和表表实现。这不是你需要的。如果你感兴趣,我相信有一个比我更好的解释,在三色标记博客。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58640689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档