为什么我们在并发GC跟踪中需要SATB算法?

时间:2017-06-21 02:00:35

标签: garbage-collection

在并发GC中说,在跟踪开始时,对象A在 根集。对象A指B和C.B和C打开 堆。在追踪过程中,mutator改变了对C的引用。所以 C死了。并且SATB algorithm表示C将被保存在记忆中 由作家屏障设定。但如果我们没有将C保存在记忆集中, 可能会发生两种情况:

  1. 在跟踪线程之前,mutator更改为C 到达C.然后当跟踪线程无法到达C时,C为 已经死亡。在这轮追踪中,现场集仅包括B.

  2. 在跟踪线程后,mutator更改为C 到达C(但在下一轮追踪之前)。然后 跟踪线程能够达到C.在这一轮跟踪中, 现场布景包括B和C.C将在下一轮收集 跟踪。

  3. 因此,在上述2个案例中,我们总是可以在没有SATB的第一轮追踪或下一轮追踪中获得正确的集合B.

    所以我的问题是:在上述情况下,SATB根本没有必要 保持并发GC正确。为什么我们懒得保存快照 在作家屏障?

1 个答案:

答案 0 :(得分:1)

对于并发收集器的讨论,您的案例并不十分有趣。 C是死的,无论收集器在当前或下一个周期中注意到它的不可达性都没有什么区别,因为GC不能保证内存立即被释放。

有趣的案例是关于活物,因为那些不想被意外释放的物体。当mutator获取尚未标记的对象(现有的或新创建的)并将其放入标记可到达对象的字段中时,很容易发生这种情况。由于保持对象已经标记为收集器,因此它不会访问另一个对象,因此写屏障必须以某种方式提供帮助。 SATB是其中一种方式。