三色标记算法 三色标记算法三色标记注意事项:标题漏标的应对方法 三色标记算法 黑色: 自身和子对象都已标记的对象 灰色: 自身已标记,子对象还没标记的对象 白色: 未标记的对象 三色标记注意事项: 浮动垃圾:本应被回收的垃圾依然让它存活 如图所示,C已经被标记为灰色,表示非垃圾,但由于是并发标记,之后A可能已经断开了对C的引用,C应该被当作垃圾回收。这就是浮动垃圾。问题不大,只是多活了一轮GC,下次依然会被回收。 漏标情况:将不是垃圾的对象,当作垃圾回收了 在运行态中,1、黑色对象指向了白色对象,2、并且同时,灰色对象取消了白色对象的引用。就会产生白色对象漏标的情况。因为黑色对象已经标记完毕,不会再去扫描,并且也没有灰色对象的指向,所以漏标了 标题漏标的应对方法 增量更新(Incremental update):关注引用的增加。如果发现黑丝A指向了白色D,将黑色A重新标记为灰色,remake过程中重新扫描。这种处理方式会造成重复扫描的情况。(CMS的处理方式) SATB(snapshot at the begining):关注引用的删除,当灰色对象B断开对D的引用后,将这个引用推倒GC的堆栈中,保证白色对象D还能被扫描到,(G1的处理方式)在扫描时拿到这个引用,由于有RSet的存在,不需要扫描整个对去查找指向白色的引用,效率比较高。