【垃圾回收算法與實現讀書筆記】標記-壓縮算法(標記-整理算法)

標記-壓縮算法

GC 標記 - 壓縮算法(Mark Compact GC)是將 GC 標記 - 清除算法與 GC 複製算
法相結合的產物。

一、Lisp2算法

標記階段與標記-清除算法一樣,壓縮階段就是讓有用的對象覆蓋掉沒用的對象,這比複製算法好,不用犧牲半個堆空間。
完成該算法實現,至少要遍歷3次堆:

  1. 找到有用的對象前面沒用的對象
  2. 移動指針
  3. 移動對象。

優點:

可有效利用堆

缺點:

遍歷三次堆不好,存在還進的空間。

二、Two-Finger算法

這是一種高效的算法,具體來說就是需要搜索 2 次堆。
Two-Finger 算法有着很大的制約條件,那就是“必須將所有對象整理成大小一致”。之前介紹的算法都沒有這種限制,而 Two -Finger 算法就必須嚴格遵守這個制約條件。原因我們會在之後的內容中進行說明。

該算法的實現就是將List2算法的第一次遍歷與第三次遍歷合併,找到沒用的對象後直接拿有用的對象替換它。這樣一來不僅不需要存儲沒用的對象指針,也可以使遍歷次數減少爲兩次:

  1. 移動對象
  2. 更新指針

優點:

相較於List2算法,即減少了時間,也減少了空間。

缺點:

  1. 制約條件,那就是“必須將所有對象整理成大小一致
  2. 無法保證有引用關係的對象在堆內相鄰,所以無法使用緩存技術。

三、表格算法

這個算法和 Two-Finger 算法一樣,都是執行 2 次壓縮操作。

表格算法通過以下 2 個步驟來執行壓縮:

  1. 移動對象(羣)以及構築間隙表格(break table)
  2. 更新指針

優點:

  1. 沒有必要爲壓縮準備出多餘的空間
  2. 保證有引用關係的對象在堆內相鄰,可以使用緩存技術

缺點:

維護表格的代價比較大

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章