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

保守式GC

保守式GC指「不能識別指針和非指針的GC」。html

  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不能使用複製算法markdown

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

黑名單

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

  • 建立「須要注意 的地址的名單」,該黑名單裏記錄着「不明確的根內的非指針,其指向的是有可能被分配對象的地址」。
  • 面向黑名單內的地址分配小對象和沒有子對象的對象能夠下降由損失。

轉載於:https://www.cnblogs.com/suolu/p/6659838.html性能