三色标记算法
1.什么是三色标记
黑色:自身和成员变量均已标记完成
灰色:自身被标记完成,成员变量未被标记
白色:未被标记的对象(垃圾)
2.漏标
什么是漏标:将原来存活的对象,但是由于没有遍历到当作垃圾回收了
产生漏标的原因:1、黑色对象指向了白色对象;2、灰色对象取消了对白色对象的引用。就会产生白色对象被漏标的情况,因为黑色对象已经标记完毕,不会再去扫描,并且也没有灰色对象的指向,所以漏标了
打破漏标:只要打破上述中的2个条件之一即可打破漏标:
incremental update – 增量更新,关注引用的增加,把黑色重新标记为灰色,下次重新扫描属性,CMS使用
SATB snapshot at the beginning – 关注引用的删除,当灰色 → 白色消失时,要把这个引用推到GC的堆栈,保证D还能被GC扫描到,G1使用
G1为什么使用SATB:灰色 → 白色引用消失时,如果没有黑色指向白色,引用会被push到堆栈下次扫描时拿到这个引用,由于有RSet的存在,不需要
扫描整个堆去查找指向白色的引用,效率比较高,SATB 配合 RSet ,浑然天成(RSet中记录了其他Region中的对象到本Region的引用,这种方式先使用被push到堆栈的引用找到白色对象,在通过白色对象所在RSet 查找哪些对象引用了白色对象)