【Java】垃圾回收器(GC)工作機制

GC工作機制


Level 0

預備知識:

  1. JVM內存結構

Level 1

定義:

垃圾收集器 (Garbage Collection, GC):
自動尋找收集無用的內存,並提供一種內存的管理機制,使開發者無序手動釋放內存1

也就是說,GC具備兩項基本功能:

  1. 檢測無效內存
  2. 清除無效內存

Level 2

檢測無效內存

檢測出系統無效內存有引用計數法可達性分析算法:

  1. 引用計數法:
    給對象添加一個計數器(ref_cnt),通過增減計數器的值來判定對象是否爲無效對象。分配內存空間時,對象計數器值+1,在更新指針的過程中,新應用對象的計數器值+1,同時指針原先對象的計數器值-1。如果計數器值爲0,則被視爲垃圾(無效內存)。
    弊端:假如數個對象相互引用,成爲閉環,計數器無法檢測。
  2. 可達性分析:
    以根對象作爲起始點進行遍歷搜索,如果有對象無引用,則該對象爲垃圾

Level 3

如何清除無效內存與垃圾收集算法有關。

垃圾收集算法

  1. 標記-清除算法(Mark-Sweep)
    遞歸每個能訪問的對象的指針數組,將每個活動對象打上mark; 將不能活動的對象進行回收; 標記-整理算法: 標記-清除的升級版; 將標記的對象移入一側,然後清掉端邊界外的內存; (在存活率較高的情況下更爲高效, 且耗空間更小)(此兩種方法適用於存活率高的對象, 比如舊生代中的對象);

  2. 複製算法(Copying)
    將內存空間等分成大小相同的兩份,執行GC時候,將當前空間的活動對象複製至另一空間,複製完成後,回收當前空間。複製的時候先將原有對象打上copy標籤,指向新空間的對象。
    標記整理。

  3. 標記-整理算法(Mark-Compact)
    標記-清除算法的升級版。標記過程與前者一致。但後面不是簡單的清除,而是讓所有存活的對象都向一端移動,然後直接清除掉端邊界以外的內存。

  4. 分代收集算法
    目前商用虛擬機常用的垃圾收集算法。JVM虛擬機中不同的區域(年輕代,老年代)使用不同的垃圾收集算法。年輕代對象生命週期較短,用Minor GC;老年代生命週期稍長,用Major GC。


  1. Program itself finds and collects memory which is useless. It is a form of automatic memory management which doesn't need programmers release memory. ↩︎

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