什么是漏标 #
我们可以将结点分为三类:
- 白色:还未搜索的对象;
- 灰色:已经搜索,但尚未扩展的对象;
- 黑色:已经搜索,也完成扩展的对象。
并发标记中最严重的问题就是漏标。如果一个对象是活跃对象,但它没有被标记,这就是漏标。这就会出现活跃对象被回收的情况。例如下图中所示:

在上图中的最左边,标号(a)的子图中,一切都还是正常的,B 尚未扩展,在 B 扩展的时候,C 自然可以被标记。在(b)中,A 出发的引用指向了 C,这时由于 B 指向 C 的引用还存在,仍然没有什么问题。但在(c)中,B 指向 C 的引用消失了,因为 A 已经变成黑色,不会再被扩展了,所以 C 就没有机会再被标记了。这就产生了漏标。
总的来说,黑色对象引用了白色对象,而白色对象又没有其他机会再被访问到,所以白色对象就被漏标了。