《垃圾回收的算法與實現》——GC復制算法
阿新 • • 發佈:2018-10-07
通過 相關 空閑 如果 字段 log 位置 必須 pos
https://www.cnblogs.com/suolu/p/6654236.html
基本概念
- GC復制算法將堆分成From和To兩個內存塊,當From被占滿時GC將From中的存活對象復制到To中,同時將From和To交換。
- 通過遞歸遍歷GC root(即采用深度優先)復制存活對象,對於已經復制過的標記其COPIED字段。
- 復制過的對象將在From的對象的forwarding記錄To中該對象地址,以便於其余引用了該對象的引用進行修改。
- 分配對象時將先判斷From中連續可用空間是否夠用(復制算法不存在碎片),如果不夠則進行一次GC,還不夠則分配失敗。
優缺點
優點
- 吞吐量大,只需要遍歷一次From空間Sweep需要遍歷兩次,而且只復制存活的對象。
- 高速分配,不需要通過空閑鏈表直接在連續的內存上進行分配。
- 沒有碎片。
- 與緩存兼容,復制存活對象時采用深度優先算法使相關聯的對象都在附近。
缺點
- 堆的使用效率低,必須分配一個To,其不能分配對象。
- 不兼容保守式GC算法,需要移動對象。
- 遞歸調用,復制對象的深度優先算法是通過遞歸調用實現的,遞歸將消耗棧等資源。
改進
Cheney的GC復制算法
針對遞歸
- 復制算法的To中增加scan指針,其指向To中已經復制過所有子對象位置。
- 首先將GC root直接引用的對象復制到To中,而後通過scan指針的移動對後續存活對象進行復制。實現了廣度優先搜索算法
- 通過scan在To中的移動實現了一個隱式的FIFO隊列。
- 取消COPIED字段,通過forwarding字段是否指向To區間來判斷該對象是否已被復制。
- 優點在於取消了遞歸,缺點則是采用了廣度優先算法使其與緩存不兼容。
近深度優先搜索方法
針對Cheney的復制算法中與緩存不兼容問題
- page:堆分隔成一個個頁面的數組;local_scanf:每個頁中搜索用的指針作為元素的數組;major_scan:指向未搜索完的頁面開頭;free:分塊開頭;
- 第一階段從GC root中將其直接引用復制到第一個頁中。
而後對每個對象按照類似深度優先算法,區別在於其原始深度優先算法每層一次只搜索一個對象而該算法則將同一層一次搜索完此處沒懂,還有頁占滿的問題
多空間復制算法
針對堆利用率低
- 將堆分成多份,每次取其中的兩個分別作為From和To,其余則采用Mark-Sweep算法。
- From總在To的右邊的塊中,每執行一次GC,From和To均向右移動一個塊。
- 在GC時先進行標記階段,當存活對象處於From時執行copy,當處於其余塊時執行mark。
- 優點在於提高了堆的利用率,缺點則是引入了Mark-Sweep算法導致STW時間變長,分塊得采用空閑鏈表
《垃圾回收的算法與實現》——GC復制算法