【原創】GC/垃圾回收簡介

GC簡介html

 

1 GC機制算法

1.1 對象post

從計算機的角度,裝有數據的內存空間spa

1.2 做用htm

將內存垃圾的釋放自動化對象

1.3 本質blog

將已經引用不到的對象視爲死亡,將死亡的對象找出來而且做爲垃圾進行回收遞歸

 

2 GC算法內存

2.1 跟蹤回收get

2.1.1 原理

從根開始掃描判斷對象的生死

2.1.2 標記清除

(1)過程

  1. 第一次掃描:以變量或運行棧做爲根,從根開始將可能被引用的對象進行標記,將沒被標記的對象進行垃圾回收
  2. 第二次掃描:將所有對象進行掃描,對沒有被標記的對象進行垃圾回收,掃描的同時還須要將存活的對象的標記去除

(2)缺點

  1. 處理時間與對象數量相關,在大量對象且極少存活的狀況下,效率不明顯
  2. 由複製收集解決這一問題

2.1.3 複製收集

(1)過程

  1. 掃描一遍:將根對象複製到新開闢的內存空間,再用複製的對象所能引用的對象進行遞歸複製
  2. 清除舊空間

(2)優缺點

  1. 掃描一遍就至關於標記清除的標記階段,清除階段開銷極小
  2. cache局部性,複製收集按照引用將關聯的對象複製到新空間,在內存空間裏距離較近,效率會提升
  3. 在存活對象大比列存在的狀況下,複製對象的開銷會加大

2.2 引用計數

2.2.1 原理

當對象引用發生變化時,利用引用計數更新對象的狀態,判斷對象的生死

2.2.2 引用計數

(1)過程

  在對象內部保持一個對該對象的引用計數,當引用發生增減時進行更新

(2)優缺點

  1. 可以作到當即釋放垃圾,中斷時間短
  2. 沒法釋放循環引用的對象
  3. 在並行環境下,須要對計數操做進行加鎖互斥,開銷較大

2.3 跟蹤回收和引用計數的結合

2.3.1 分代回收

(1)原理

  大部分對象在短期裏會成爲垃圾,而通過必定時間仍然存活下來的每每擁有較長的壽命,因此增長新生的對象的掃描,減小老生對象的掃描

(2)過程

  1. GC小回收:利用複製收集,將新空間標記爲老生代或利用標記清除方式將存活對象標記爲老生代,清除死亡對象
  2. GC大回收(偶爾進行):以所有區域爲對象進行GC操做

(3)記錄集

  1. 在對象引用發生改變時,若是老生代對象引用到了新生代對象,則將引用記錄加入到記錄集
  2. 須要時刻保持更新,新生代被老生代引用的瞬間就必須更新

(4)寫屏障

  須要將添加到記錄集的操做嵌入到對象修改的地方,對全部涉及修改對象的地方進行保護

(5)優缺點

  1. 減小了須要掃描的對象,縮短GC時間
  2. 算法受到程序行爲,分代數量,大回收的觸發條件的影響

2.3.2 增量回收

(1)原理

  1. 將GC操做分爲多個階段進行
  2. 與分代回收類似,須要增長寫屏障,防止存活的對象被清除,而該清除的對象沒被清除

(2)優缺點

  中斷時間取決於對象的數量,在犧牲總GC時間的狀況下,縮短中斷時間

2.3.3 並行回收

(1)原理

  1. 程序運行和GC同時進行
  2. 須要寫屏障對狀態進行實時更新

(2)特色

  1. 在GC的某個階段仍是須要暫停程序的運行,沒法徹底與程序並行
  2. 將來趨勢

2.4 GC大一統理論

  全部的GC算法都是跟蹤回收和引用計數的結合,二者相互獨立,對其中一方進行改善的技術之中必然存在對另外一方的改善技術,而其結果只是兩種的結合

 

3 思惟導圖

本文連接:http://www.cnblogs.com/cposture/p/4845189.html

相關文章
相關標籤/搜索