本文重点
在前面的课程中我们已经学习了垃圾回收器CMS和G1,其中CMS和G1中的mixedGC都存在四个过程,这四个过程中有一个过程叫做并发标记,也就是说程序一边运行,一边标记垃圾。这个过程最困难的是:如果在标记垃圾的时候,如果对象的引用关系发生了改变,此时应该如何处理?
问题详解
简单来说就是,对象A不是垃圾,但是在并发标记的过程中,指向A的引用关系发生了变化,程序没有及时发现,从而误认为没有引用指向A,从而造成了A被当作垃圾而被回收的情况,这个情况我们称为漏标,漏标可以通过三色标记的方式来完成。
三色标记的基本含义
三色标记表示有三种颜色,每种颜色有独特的意义,如下所示:
白色:自身未被标记的对象
灰色:自身被标记,成员变量未被标记
黑色:自身和成员变量均已标记完成
被标记了就可以认为自己不是垃圾了。
三色标记法
如上所示,现在有三个对象,分别为A、B、D,其中A是自身和成员变量均已标记完成。B是自身被标记而成员未被标记。D是自身未被标记。现在假如在并发执行的过程中,有一个黑色的对象指向了白色,而灰色不再指向白色的对象了,如下所示: