1. 程式人生 > 其它 >三色標記演算法

三色標記演算法

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 查詢哪些物件引用了白色物件)