什么是浮動垃圾 CMS為什么要重新標記 G1是怎么優化重新標記的過程的


1 浮動垃圾 如圖,GC 線程便利對象樹(實際是圖),遍歷過了A ,然后遍歷過了B,遍歷到了C,但是還沒有遍歷完C的兒子D,這時候如果 A.B=null; 那么B就變成了浮動垃圾,本次GC 過程B不會被清除。只能下次清除。

 

 

 

2 GC 三色標記算法過程中,白色的節點指向 黑色的節點 怎么辦? (增量更新,和寫屏障)

  直接把黑色變成灰色,這是浮動垃圾嗎?不是,因為黑色節點變成了灰色,GC線程每次暫停后開始都會重灰色線程開始,也就是說黑色變成灰色以后,會重新便利這個灰色和下面的非黑色節點。

 

 

3 三色算法為什么要重新標記,便利灰色節點的子節點過程中,如果已經被遍歷的子節點(已經被遍歷過的子節點可能是黑色或者灰色)被指向了一個白色節點A.B=E ,然后這個B位置變成了白色的E,黑色的E變成了浮動垃圾。

如果直接刪除B不會被刪除,但是E會被刪除,我們希望的E不會刪除,B 被刪除,B浮動垃圾下次GC在刪除沒問題,E 肯定不能刪除,所有需要重新標記一邊(這時候只能暫停業務線程(STW),不然又會出現類似的情況),重新標記只遍歷黑色節點,看看下面是否有白色節點,有就標記成黑色。因為GC 這個過程實際有標記成黑色的一般比較少,所以比並發標記的對象少很多,速度要快一些,但是也標記了2次。

  

 

 

 

4 G1 怎么處理三色標記算法

  在上面圖 A.B=E 的過程中,G1 把這個數據記錄下來,編發標記完了不是去遍歷所有黑色,而是去遍歷 記錄的 那份數據,這時候記錄的數據 里面有個白色的E,只要通過分區集合找到 有關聯的分區中如果有父黑色的節點指向

這個白色的E,有就標記成黑色,如果沒有就保持白色(保持白色,是這個過程中業務線程把 A.E= null )

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM