三色标记算法

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 @   ZT丶  阅读(200)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
主题色彩