標籤:
GC簡介
1 GC機制
1.1 對象
從電腦的角度,裝有資料的記憶體空間
1.2 作用
將記憶體垃圾的釋放自動化
1.3 本質
將已經引用不到的對象視為死亡,將死亡的對象找出來並且作為垃圾進行回收
2 GC演算法
2.1 跟蹤回收
2.1.1 原理
從根開始掃描判斷對象的生死
2.1.2 標記清除
(1)過程
- 第一次掃描:以變數或運行棧作為根,從根開始將可能被引用的對象進行標記,將沒被標記的對象進行記憶體回收
- 第二次掃描:將全部對象進行掃描,對沒有被標記的對象進行記憶體回收,掃描的同時還需要將存活的對象的標記去除
(2)缺點
- 處理時間與對象數量相關,在大量對象且極少存活的情況下,效率不明顯
- 由複製收集解決這一問題
2.1.3 複製收集
(1)過程
- 掃描一遍:將根對象複製到新開闢的記憶體空間,再用複製的對象所能引用的對象進行遞迴複製
- 清除舊空間
(2)優缺點
- 掃描一遍就相當於標記清除的標記階段,清除階段開銷極小
- cache局部性,複製收集按照引用將關聯的對象複製到新空間,在記憶體空間裡距離較近,效率會提高
- 在存活對象大比列存在的情況下,複製對象的開銷會加大
2.2 引用計數
2.2.1 原理
當對象引用發生變化時,利用引用計數更新對象的狀態,判斷對象的生死
2.2.2 引用計數
(1)過程
在對象內部保持一個對該對象的引用計數,當引用發生增減時進行更新
(2)優缺點
- 能夠做到立即釋放垃圾,停機時間短
- 無法釋放循環參考的對象
- 在並行環境下,需要對計數操作進行加鎖互斥,開銷較大
2.3 跟蹤回收和引用計數的結合
2.3.1 分代回收
(1)原理
大部分對象在短時間裡會成為垃圾,而經過一定時間仍然存活下來的往往擁有較長的壽命,所以增加新生的對象的掃描,減少老生對象的掃描
(2)過程
- GC小回收:利用複製收集,將新空間標記為老生代或利用標記清除方式將存活對象標記為老生代,清除死亡對象
- GC大回收(偶爾進行):以全部地區為對象進行GC操作
(3)記錄集
- 在對象引用發生改變時,如果老生代對象引用到了新生代對象,則將引用記錄加入到記錄集
- 需要時刻保持更新,新生代被老生代引用的瞬間就必須更新
(4)寫屏障
需要將添加到記錄集的操作嵌入到對象修改的地方,對所有涉及修改對象的地方進行保護
(5)優缺點
- 減少了需要掃描的對象,縮短GC時間
- 演算法受到程式行為,分代數量,大回收的觸發條件的影響
2.3.2 增量回收
(1)原理
- 將GC操作分為多個階段進行
- 與分代回收相似,需要增加寫屏障,防止存活的對象被清除,而該清除的對象沒被清除
(2)優缺點
停機時間取決於對象的數量,在犧牲總GC時間的情況下,縮短停機時間
2.3.3 並行回收
(1)原理
- 程式運行和GC同時進行
- 需要寫屏障對狀態進行即時更新
(2)特點
- 在GC的某個階段還是需要暫停程式的運行,無法完全與程式並行
- 未來趨勢
2.4 GC大一統理論
所有的GC演算法都是跟蹤回收和引用計數的結合,兩者相互獨立,對其中一方進行改善的技術之中必然存在對另一方的改善技術,而其結果只是兩種的結合
3 思維導圖
本文連結:http://www.cnblogs.com/cposture/p/4845189.html
【原創】GC/記憶體回收簡介