作用:因并发标记过程中,程序还在跑。对象间的引用会发生变化,可能会导致漏标或错标情况。因此采用三色法,将扫描的各情况用颜色区别出来。
三种颜色
白色:一开始所有对象的颜色都是白色,即未扫描过的对象。
灰色:表示对象已经扫描到了,但是对象所在的引用对象,还未全部扫描完成。
黑色:表示当前对象自身以及引用对象都已扫描,标记为黑色。
备注:黑色对象不能直接指向白色对象,不经过黑色对象。
代码示例:
class A {
B b = new B();
D d = null;
}
class B {
C c = new C();
D d = new D();
}
class C {
}
class D {
}
以下为三色关系图
浮动垃圾:并发清除阶段,因程序没有暂停运行(考虑停顿时间),标记与用户线程交错的执行。导致产生了多余垃圾,需要下一次扫描才可通过垃圾回收清除。
漏标:会导致对象被当成垃圾误回收。所以此情况不允许发生
解决方案:
增量更新:当黑色对象突然引用白色对象时,黑色对象所指向白色对象需要变更为灰色对象。(待并发扫描结束后,在从黑色对象为根在扫描一次即可)
原始快照:灰色对象要删除白色对象的引用时,将要删除的引用记录下来,并发扫描结束后。再从引用关系为灰色对象扫描一下即可。