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

《垃圾回收的算法與實現》第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 的垃圾回收

電子書下載連接ios


第 2 章 GC標記-清除算法

一圖總結文章內容git

graph LR mark("mark(從根深搜廣搜活動對象)")-->Sweep("Sweep(掃描堆)")-->單鏈表再分配("單鏈表再分配(最早匹配、最優匹配、最糟糕匹配)")-->優缺點 Sweep("Sweep(掃描堆)")-->多鏈表再分配("多鏈表再分配(根據大小分鏈表)")-->優缺點 位圖標記("位圖標記") 延遲清除("延遲清除法")

什麼是GC標記-清除法

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

標記階段

標記使用什麼搜索方式呢?廣度搜索、深度搜索,這個過程是要中斷對象操做的,不中斷的話,新生成的對象 就可能不可達。算法

清除階段

在清除階段,咱們使用變量 sweeping 遍歷堆,具體來講就是從堆首地址 $heap_start 開始,按順序一個個遍歷對象的標誌位。學習

分配階段

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

碎片合併

前文中已經提過,根據分配策略的不一樣可能會產生大量的小分塊。但若是它們是連續的, 咱們就能把全部的小分塊連在一塊兒造成一個大分塊。這種「鏈接連續分塊」的操做就叫做合 並(coalescing),合併是在清除階段進行的。對象

優勢

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

缺點

  1. 碎片化
  2. 分配速度
  3. 與寫時複製技術不兼容 進程 fork 節省內存的方法

多個鏈表的空閒表

利用分塊大小不一樣的空閒鏈表,即建立只鏈接大分塊的空 閒鏈表和只鏈接小分塊的空閒鏈表。進程

BiBOP

將大小相近的對象整理成固定大小的塊進行管理的作法內存

延遲清除

我的對這裏有新理解: 全部的對象,一旦對象不在根部有引用,那麼這個對象就不可能再被引用,標記後,沒有被標記的對象必定是非活動對象了,可是新產生的對象再後續的發展中 可能成爲非活動對象也可能成爲非活動對象,那麼這些新對象都標記不能被清除,所以沒有標記的對象是能夠延遲清除的,不會再次被標記。可是要注意新對象都要標記。ci

請期待 「第 3 章 引用計數法」

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