一、定义
三色标记算法是一种用于垃圾收集的算法,它将内存中的对象分为三种颜色:白色、灰色和黑色。标记完毕后,所有可达对象都为黑色,剩余的白色对象视为不可达,可以被清除。
- 白色:该对象未被标记,表示垃圾对象;
- 灰色:当前对象被标记为非垃圾对象,但是它的子对象未被扫描;
- 黑色:当前对象被标记为非垃圾对象且它的子对象已被扫描。
这种算法的目的是通过可达性分析来识别和回收不再被程序引用的对象,从而释放内存空间。
二、标记过程
找到所有的GC Root,并标记为灰色,然后继续往下扫描,继续向下的节点标记为灰色,上一个节点则从灰色标为黑色,重复该过程。最后标记完毕,所有可达对象都为黑色,剩余的白色对象(未被标记的对象)视为不可达,即垃圾对象,可以被清除掉。
三、优缺点
1、优点
2、缺点
传统的标记方式会伴随STW,所以对象间的引用不会发生改变。而并发标记在标记期间程序依然在运行,对象的引用可能发生改变,就会出现错标和漏标的情况。
(1)错标产生的浮动垃圾
(2)对象漏标问题
四、应用场景
1、CMS标记过程
- 初始标记:把所有直接引用了GC Root的对象全部标记为灰色;
- 并发标记:扫描直接引用了灰色对象的对象,并标记为灰色,原灰色对象则标记为黑色;
- 重新标记:矫正并发标记阶段的错标问题;
- 并发清除:清除白色对象(未被标记对象)
参考地址:
带颜色的JVM:三色标记详解_三色标记法 为什么要重新标记-CSDN博客