Refine线程

Refine线程

Refine线程 #

RSet 具体是何时被记录的呢?答案是写屏障。如下图所示: G1 在 RSet 中记录的也是 card。比如 Region1 中的对象 A 引用了 Region2 的对象 B,那么对象 A 所对应的 card 就会被记录在 Region2 的 RSet 中(注意!不是 Region1 的 RSet)。

在 G1 中,我们把这种 card 称为 dirty card。和 SATB 相似,业务线程也不是直接将 dirty card 放到 RSet 中的。而是在业务线程中引入一个叫做 dirty card queue(DCQ)的队列,在写屏障中,业务线程只需要将 dirty card 放入 DCQ 中,而不做非常细致的检查。

接下来,GC 线程中,有一类特殊的线程,它们会从 DCQ 中找到这种 dirty card,然后再去做更精细的检查,只有确实不属于 RSet的维护策略中所描述的三种情况的跨区引用,才真正放到专属 RSet 中去。这一类特殊的线程就是 G1 GC 中的 Refine 线程。

Viewpoint #

From #

22 | G1 GC:分区回收算法说的是什么?