《垃圾回收的算法與實現》——保守式GC


保守式GC

保守式GC指“不能識別指針和非指針的GC”。

  1. 不明確的根,寄存器、調用棧。全局變量空間等屬於GC root,這些GC均不能識別出是指針還是非指針。
  2. 指針的識別,在不明確的根的條件下可以已某種程度的精度來識別指針。
    1. 是否被正確對其
    2. 是否指向堆
    3. 是否指向對象的頭

必須同時這三個基本的檢查項目才可能是指針

  1. 不明確的根很可能出現數值但是同時滿足以上三個條件產生"貌似指針的非指針(false point)",此時GC采取一種保守的態度,把所有可疑的引用均當作指針,因此稱作保守式GC。
  2. 有點在於容易編寫語言處理程序。
  3. 缺點則是識別指針的成本、錯誤識別指針導致垃圾變成存活對象和不能使用復制算法等移動對象的GC算法。

准確式GC

  1. 正確的根,可以直接識別出是指針還是非指針,都需要語言處理程序加工,即為准確式GC(Exact GC)
  2. 打標簽,將不明確的根的所有非指針與指針區分開。32位系統的指針是4的倍數,低2位一定是0,因此可以讓非指針左移一位,而后將最后一位置1,如果溢出則換一個大的數據類型。
  3. 不把寄存器和棧等當作根,而由處理程序來創建根。
  4. 優點在於不存在指針不明確,可以使用復制移動算法。
  5. 缺點則是需要語言處理程序對GC做支持,而且打標簽等方式需要消耗資源與性能。

改進

間接引用

針對保守式GC不能使用復制算法

  • 保守式GC不能使用復制算法原因在於當某個根為false point時,對其指定的對象進行復制時將修改該根,但是該根其實質應該是具體的數值,這將導致程序異常。
  • 通過句柄(handle)來間接處理對象,所有的根只指向對象句柄,句柄再指向具體的對象,當移動對象時不需要改變根,只需要改變句柄的值。
  • 優點:保守式GC可以使用復制算法
  • 缺點:訪問一次對象需要訪問內存兩次。

黑名單

針對保守式GC指針識別錯誤

  • 創建“需要注意 的地址的名單”,該黑名單里記錄着“不明確的根內的非指針,其指向的是有可能被分配對象的地址”。
  • 面向黑名單內的地址分配小對象和沒有子對象的對象可以降低由損失。


免責聲明!

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



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