1. 程式人生 > >GC--原理和常見回收演算法

GC--原理和常見回收演算法

一.   原理

GC是垃圾收集的意思(Garbage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,Java語言沒有提供釋放已分配記憶體的顯示操作方法。

簡而言之,GC是將java的無用的堆物件進行清理,釋放記憶體,以免發生記憶體洩露

二 .   常見回收演算法

1、標記-清除演算法:

標記階段:先通過根節點,標記所有從根節點開始的可達物件。因此,未被標記的物件就是未被引用的垃圾物件;

清除階段:清除所有未被標記的物件。

2、複製演算法:(新生代的GC)

將原有的記憶體空間分為兩塊,每次只使用其中一塊,在垃圾回收時,將正在使用的記憶體中的存活物件複製到未使用的記憶體塊中,然後清除正在使用的記憶體塊中的所有物件。

3、標記-整理演算法:(老年代的GC)

標記階段:先通過根節點,標記所有從根節點開始的可達物件。因此,未被標記的物件就是未被引用的垃圾物件

整理階段:將將所有的存活物件壓縮到記憶體的一端;之後,清理邊界外所有的空間

4、分代收集演算法:

存活率低:少量物件存活,適合複製演算法:在新生代中,每次GC時都發現有大批物件死去,只有少量存活(新生代中98%的物件都是“朝生夕死”),那就選用複製演算法,只需要付出少量存活物件的複製成本就可以完成GC。

存活率高:大量物件存活,適合用標記-清理/標記-整理:在老年代中,因為物件存活率高、沒有額外空間對他進行分配擔保,就必須使用“標記-清理”/“標記-整理”演算法進行GC。