GC工作機制
Level 0
預備知識:
Level 1
定義:
垃圾收集器 (Garbage Collection, GC):
自動尋找收集無用的內存,並提供一種內存的管理機制,使開發者無序手動釋放內存1。
也就是說,GC具備兩項基本功能:
- 檢測無效內存
- 清除無效內存
Level 2
檢測無效內存
檢測出系統無效內存有引用計數法和可達性分析算法:
- 引用計數法:
給對象添加一個計數器(ref_cnt),通過增減計數器的值來判定對象是否爲無效對象。分配內存空間時,對象計數器值+1,在更新指針的過程中,新應用對象的計數器值+1,同時指針原先對象的計數器值-1。如果計數器值爲0,則被視爲垃圾(無效內存)。
弊端:假如數個對象相互引用,成爲閉環,計數器無法檢測。 - 可達性分析:
以根對象作爲起始點進行遍歷搜索,如果有對象無引用,則該對象爲垃圾。
Level 3
如何清除無效內存與垃圾收集算法有關。
垃圾收集算法
-
標記-清除算法(Mark-Sweep)
遞歸每個能訪問的對象的指針數組,將每個活動對象打上mark; 將不能活動的對象進行回收; 標記-整理算法: 標記-清除的升級版; 將標記的對象移入一側,然後清掉端邊界外的內存; (在存活率較高的情況下更爲高效, 且耗空間更小)(此兩種方法適用於存活率高的對象, 比如舊生代中的對象); -
複製算法(Copying)
將內存空間等分成大小相同的兩份,執行GC時候,將當前空間的活動對象複製至另一空間,複製完成後,回收當前空間。複製的時候先將原有對象打上copy標籤,指向新空間的對象。
標記整理。 -
標記-整理算法(Mark-Compact)
標記-清除算法的升級版。標記過程與前者一致。但後面不是簡單的清除,而是讓所有存活的對象都向一端移動,然後直接清除掉端邊界以外的內存。 -
分代收集算法
目前商用虛擬機常用的垃圾收集算法。JVM虛擬機中不同的區域(年輕代,老年代)使用不同的垃圾收集算法。年輕代對象生命週期較短,用Minor GC;老年代生命週期稍長,用Major GC。
Program itself finds and collects memory which is useless. It is a form of automatic memory management which doesn't need programmers release memory. ↩︎