《垃圾回收的算法與實現》——GC複製算法

基本概念

  • GC複製算法將堆分紅From和To兩個內存塊,當From被佔滿時GC將From中的存活對象複製到To中,同時將From和To交換。
  • 經過遞歸遍歷GC root(即採用深度優先)複製存活對象,對於已經複製過的標記其COPIED字段。
  • 複製過的對象將在From的對象的forwarding記錄To中該對象地址,以便於其他引用了該對象的引用進行修改。
  • 分配對象時將先判斷From中連續可用空間是否夠用(複製算法不存在碎片),若是不夠則進行一次GC,還不夠則分配失敗。

優缺點

優勢

  1. 吞吐量大,只須要遍歷一次From空間Sweep須要遍歷兩次,並且只複製存活的對象。
  2. 高速分配,不須要經過空閒鏈表直接在連續的內存上進行分配。
  3. 沒有碎片。
  4. 與緩存兼容,複製存活對象時採用深度優先算法使相關聯的對象都在附近。

缺點

  1. 堆的使用效率低,必須分配一個To,其不能分配對象。
  2. 不兼容保守式GC算法,須要移動對象。
  3. 遞歸調用,複製對象的深度優先算法是經過遞歸調用實現的,遞歸將消耗棧等資源。

改進

Cheney的GC複製算法

針對遞歸html

  • 複製算法的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時間變長,分塊得采用空閒鏈表

轉載於:https://www.cnblogs.com/suolu/p/6654236.html緩存