相关系列
三色标记产生的原因?
在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,就会产生多标和漏标的情况,为了解决这个问题便引入三色标记算法。
三色标记定义
三色标记算法是根据GC roots可达性分析遍历对象过程中遇到的对象,按照“是否访问过”这个条件标记成以下三种色:
- 白色:表示对象未被垃圾收集器访问过,这是可达性分析开始的阶段,所有的对象都是白色,如果分析结束阶段,还是白色,即代表不可达。
- 灰色:表示对象被垃圾收集器访问过,但是至少还有一个引用没有被扫描过。
- 黑色:表示对象已被垃圾收集器访问过了,并且这个对象所有对象都被扫描过了,它是安全存活的,如果有其它对象引用指向了黑色对象,无须重新扫描一遍。黑色对象不可能直接指向某个白色对象。
案例分析
程序代码
package com.dzend.mall.order;
public class ThreeColorRemark {
public static void main(String[] args) {
ClassA classA = new ClassA();
ClassD classD = classA.classB.classD;
classA.classD = classD;
}
}
class ClassA {
ClassB classB = new ClassB();
ClassD classD = null;
}
class ClassB {
ClassC classC = new ClassC();
ClassD classD = new ClassD();
}
class ClassC {
}
class ClassD {
}