Loading

三色标记算法

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 查找哪些对象引用了白色对象)

posted @ 2022-01-17 15:10  ZT丶  阅读(185)  评论(0编辑  收藏  举报