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

如上所示,现在有三个对象,分别为A、B、D,其中A是自身和成员变量均已标记完成。B是自身被标记而成员未被标记。D是自身未被标记。现在假如在并发执行的过程中,有一个黑色的对象指向了白色,而灰色不再指向白色的对象了,如下所示:
本文介绍了JVM垃圾回收中的三色标记法,用于解决并发标记过程中的漏标问题。三色标记法通过白色、灰色和黑色表示对象的标记状态,防止对象因引用关系变化导致的误回收。文章详细分析了漏标的产生条件及两种解决策略:增量更新和STAB,分别在CMS和G1垃圾回收器中应用。
订阅专栏 解锁全文
470

被折叠的 条评论
为什么被折叠?



