《垃圾回收的演算法與實現》第2章GC標記-清除演算法

wlxklyh發表於2020-10-27

《垃圾回收的演算法與實現》第2章GC標記-清除演算法

2020-10-21-22-58-08

垃圾回收系列連載:


  1. 第 1 章 學習GC之前
  2. 第 2 章 GC標記-清除演算法
  3. 第 3 章 引用計數法
  4. 第 4 章 GC複製演算法
  5. 第 5 章 GC標記-壓縮演算法
  6. 第 6 章 保守式GC
  7. 第 7 章 分代垃圾回收
  8. 第 8 章 增量式垃圾回收
  9. 第 9 章 RC Immix 演算法
  10. 第 10 章 Python 的垃圾回收
  11. 第 11 章 DalvikVM 的垃圾回收
  12. 第 12 章 Rubinius 的垃圾回收

電子書下載連結


第 2 章 GC標記-清除演算法

一圖總結文章內容

graph LR
    mark("mark(從根深搜廣搜活動物件)")-->Sweep("Sweep(掃描堆)")-->單連結串列再分配("單連結串列再分配(最先匹配、最優匹配、最糟糕匹配)")-->優缺點
    Sweep("Sweep(掃描堆)")-->多連結串列再分配("多連結串列再分配(根據大小分連結串列)")-->優缺點
    點陣圖標記("點陣圖標記")
    延遲清除("延遲清除法")

什麼是GC標記-清除法

標記清除法是一種找到垃圾的方法,就是分成兩個步驟,標記和清除,標記是從根部除法做搜尋,經過的則標記,清除是從堆遍歷 找到沒有使用則清除。 20201022210008

標記階段

標記使用什麼搜尋方式呢?廣度搜尋、深度搜尋,這個過程是要中斷物件操作的,不中斷的話,新生成的物件 就可能不可達。

清除階段

在清除階段,我們使用變數 sweeping 遍歷堆,具體來說就是從堆首地址 $heap_start 開始,按順序一個個遍歷物件的標誌位。

分配階段

這裡的分配是指將回收的垃圾進行再利用。遍歷 $free_list,尋找合適的 size 的分塊就是分配階段。 First -fit、Best -fit、Worst -fit 的不同: 20201027234718

碎片合併

前文中已經提過,根據分配策略的不同可能會產生大量的小分塊。但如果它們是連續的, 我們就能把所有的小分塊連在一起形成一個大分塊。這種“連線連續分塊”的操作就叫作合 並(coalescing),合併是在清除階段進行的。

優點

  1. 實現簡單
  2. 與保守式 GC 演算法相容

缺點

  1. 碎片化
  2. 分配速度
  3. 與寫時複製技術不相容 程式 fork 節省記憶體的方法

多個連結串列的空閒表

利用分塊大小不同的空閒連結串列,即建立只連線大分塊的空 閒連結串列和只連線小分塊的空閒連結串列。

BiBOP

將大小相近的物件整理成固定大小的塊進行管理的做法

延遲清除

個人對這裡有新理解: 所有的物件,一旦物件不在根部有引用,那麼這個物件就不可能再被引用,標記後,沒有被標記的物件一定是非活動物件了,但是新產生的物件再後續的發展中 可能成為非活動物件也可能成為非活動物件,那麼這些新物件都標記不能被清除,因此沒有標記的物件是可以延遲清除的,不會再次被標記。但是要注意新物件都要標記。

請期待 “第 3 章 引用計數法”

個人簡介:高階開發工程師,興趣和領域(Unity、Unreal、cocos creator、安卓終端開發、ios終端開發、音視訊開發、圖形學),歡迎加W:wlxklyh 探討問題。(歡迎star:https://github.com/wlxklyh/SoftRenderer)

相關文章