什么是三色标记
三色标记是指垃圾收集器在进行可达性分析时,用白、黑、灰来标记对象状态的一种机制。其中白色表示该对象还没有被标记过;灰色表示这个对象被垃圾收集器访问过,但是对象内部的引用还没有完全被扫描过;黑色表示这个对象以及这个对象内部的引用都被扫描过。扫描结束后状态还是白色的对象便是要被清理的对象。
三色标记的缺点
并发环境下会出现多标和漏标问题,多标就是已经将某个对象标记为灰色但是用户线程又放弃了该对象。漏标是在扫描后某个黑色对象又引用了白色对象,导致了漏标发生。
如何解决漏标问题:增量更新或者原始快照
增量更新:记录扫描时在黑色对象中重新插入白色对象的情况,扫描后再将这些黑色对象作为根节点重新扫描
原始快照:当灰色对象要删除白色引用关系时,要将这些情况记录下来,本次扫描后再进行一次扫描标记