首页 > 解决方案 > 读/写障碍如何真正应用于垃圾收集代码?

问题描述

我对垃圾收集器文献中如何定义读/写障碍感到困惑。我的理解是,它们是关于检测发生在 mutator 线程中的读取和写入(因此,在较低级别的术语中,读取和存储)。另一种说法是,这些是在加载/存储之前注入的代码位。到目前为止,一切都很好。

但后来我看一下这篇文章的例子:

在此处输入图像描述

( shenandoah-gc-in-jdk-13-part-1-load-reference-barriers/ )

我对设置障碍的地方的解释是:

void example(Foo foo) {
  Bar b1 = RB(RB(foo).bar);
  while (..) {
    Baz baz = RB(RB(b1).baz);
    WB(RB(b1), RB(makeSomeValue(baz)));
  }
}

也就是说,每次读取引用时,都会放置一个读屏障,每次执行写入时,都会放置一个写屏障。但我肯定是错的,所以,我错了什么?

我可以看到,在诸如The Locality of Concurrent Write Barriers 之类的文章中,他们还将障碍称为对o.f = p(" 类型的表达式进行操作。根据策略,障碍可能会注意到将新指针 p 插入 o 或删除的旧指针"),好像它们只会应用于对象的字段,而不是x = y像我所期望的那样应用于类型的通用赋值。

标签: garbage-collectionvirtual-machine

解决方案


推荐阅读