三色标记算法是一种垃圾标记的算法,用于cms和g1。
它将对象分为3种颜色:
1.白色对象:未被标记的对象
2.灰色对象:自身被标记,引用的其它对象还没被标记
3.黑色对象:自身以及所引用的对象都被标记完
标记过程:
初始状态所有对象都是白色的,
从gc roots出发,将gc roots都标记成灰色,然后递归扫描所有灰色对象,当灰色对象的所有引用都处理完的时候,将灰色对象标记成黑色;最终所有存活的对象都会被标记成黑色,白色对象就是垃圾,会被清除。
会产生漏标的问题:
漏标产生的条件:黑色对象指向了白色对象,同时灰色对象指向白色对象的引用消失。
解决方法有两种: