《垃圾回收的演算法與實現》第2章GC標記-清除演算法
《垃圾回收的演算法與實現》第2章GC標記-清除演算法
垃圾回收系列連載:
- 第 1 章 學習GC之前
- 第 2 章 GC標記-清除演算法
- 第 3 章 引用計數法
- 第 4 章 GC複製演算法
- 第 5 章 GC標記-壓縮演算法
- 第 6 章 保守式GC
- 第 7 章 分代垃圾回收
- 第 8 章 增量式垃圾回收
- 第 9 章 RC Immix 演算法
- 第 10 章 Python 的垃圾回收
- 第 11 章 DalvikVM 的垃圾回收
- 第 12 章 Rubinius 的垃圾回收
第 2 章 GC標記-清除演算法
一圖總結文章內容
graph LR
mark("mark(從根深搜廣搜活動物件)")-->Sweep("Sweep(掃描堆)")-->單連結串列再分配("單連結串列再分配(最先匹配、最優匹配、最糟糕匹配)")-->優缺點
Sweep("Sweep(掃描堆)")-->多連結串列再分配("多連結串列再分配(根據大小分連結串列)")-->優缺點
點陣圖標記("點陣圖標記")
延遲清除("延遲清除法")
什麼是GC標記-清除法
標記清除法是一種找到垃圾的方法,就是分成兩個步驟,標記和清除,標記是從根部除法做搜尋,經過的則標記,清除是從堆遍歷 找到沒有使用則清除。
標記階段
標記使用什麼搜尋方式呢?廣度搜尋、深度搜尋,這個過程是要中斷物件操作的,不中斷的話,新生成的物件 就可能不可達。
清除階段
在清除階段,我們使用變數 sweeping 遍歷堆,具體來說就是從堆首地址 $heap_start 開始,按順序一個個遍歷物件的標誌位。
分配階段
這裡的分配是指將回收的垃圾進行再利用。遍歷 $free_list,尋找合適的 size 的分塊就是分配階段。 First -fit、Best -fit、Worst -fit 的不同:
碎片合併
前文中已經提過,根據分配策略的不同可能會產生大量的小分塊。但如果它們是連續的, 我們就能把所有的小分塊連在一起形成一個大分塊。這種“連線連續分塊”的操作就叫作合 並(coalescing),合併是在清除階段進行的。
優點
- 實現簡單
- 與保守式 GC 演算法相容
缺點
- 碎片化
- 分配速度
- 與寫時複製技術不相容 程式 fork 節省記憶體的方法
多個連結串列的空閒表
利用分塊大小不同的空閒連結串列,即建立只連線大分塊的空 閒連結串列和只連線小分塊的空閒連結串列。
BiBOP
將大小相近的物件整理成固定大小的塊進行管理的做法
延遲清除
個人對這裡有新理解: 所有的物件,一旦物件不在根部有引用,那麼這個物件就不可能再被引用,標記後,沒有被標記的物件一定是非活動物件了,但是新產生的物件再後續的發展中 可能成為非活動物件也可能成為非活動物件,那麼這些新物件都標記不能被清除,因此沒有標記的物件是可以延遲清除的,不會再次被標記。但是要注意新物件都要標記。
請期待 “第 3 章 引用計數法”
個人簡介:高階開發工程師,興趣和領域(Unity、Unreal、cocos creator、安卓終端開發、ios終端開發、音視訊開發、圖形學),歡迎加W:wlxklyh 探討問題。(歡迎star:https://github.com/wlxklyh/SoftRenderer)
相關文章
- 垃圾回收演算法|GC標記-清除演算法演算法GC
- 垃圾回收的標記清除演算法詳解演算法
- Golang 垃圾回收-三色標記清除演算法Golang演算法
- Java虛擬機器-GC垃圾回收演算法-標記清除法、複製演算法、標記壓縮法、分代演算法Java虛擬機GC演算法
- 【JVM第八篇--垃圾回收】GC和GC演算法JVMGC演算法
- 學習八、JavaScript的記憶體管理及垃圾回收(GC演算法)JavaScript記憶體GC演算法
- jvm(三)——jvm垃圾回收演算法以及實現JVM演算法
- 物件回收判定與垃圾回收演算法-JVM學習筆記(1)物件演算法JVM筆記
- JVM 垃圾回收演算法和垃圾回收器JVM演算法
- Unity GC垃圾回收UnityGC
- GC垃圾回收器GC
- JVM垃圾回收演算法JVM演算法
- Java虛擬機器-GC垃圾回收演算法-引用計數法Java虛擬機GC演算法
- 深入理解Java的垃圾回收機制(GC)實現原理JavaGC
- 深入探究JVM之垃圾回收演算法實現細節JVM演算法
- 必知必會JVM垃圾回收——物件搜尋演算法與回收演算法JVM物件演算法
- JVM(四)垃圾回收的實現演算法和執行細節JVM演算法
- Java虛擬機器-GC垃圾回收演算法-判定一個物件是否是可回收的物件Java虛擬機GC演算法物件
- .Net平臺的GC垃圾回收GC
- 淺談垃圾回收演算法演算法
- JVM(九):垃圾回收演算法JVM演算法
- GC判定與回收演算法+java物件引用型別GC演算法Java物件型別
- java學習筆記-4 JVM垃圾回收(GC)Java筆記JVMGC
- 十種GC垃圾回收器GC
- JVM記憶體分配策略,及垃圾回收演算法JVM記憶體演算法
- 聊聊JVM的垃圾回收機制GCJVMGC
- jdk8:垃圾回收演算法JDK演算法
- jvm有哪些垃圾回收演算法JVM演算法
- java垃圾回收有哪些演算法Java演算法
- jvm入門及理解(六)——垃圾回收與演算法JVM演算法
- Go語言實時GC - 三色標記演算法GoGC演算法
- 【JVM】垃圾回收的四大演算法JVM演算法
- 託管堆和垃圾回收(GC)GC
- 垃圾回收演算法:引用計數法演算法
- JVM系列(五) - JVM垃圾回收演算法JVM演算法
- JVM調優:基本垃圾回收演算法JVM演算法
- Python垃圾回收(GC)三層心法,你瞭解到第幾層?PythonGC
- 六種主要的垃圾回收演算法和思想演算法