1. 程式人生 > >jvm--垃圾收集器與記憶體分配策略

jvm--垃圾收集器與記憶體分配策略

標記—清除演算法

 1)標記階段:先通過根節點,標記所有從根節點開始的物件,未被標記的為垃圾物件

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

複製演算法:

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

標記—整理演算法:(若物件存活率比較高,就要進行多次複製,效率比較低)

   1)標記階段:先通過根節點,標記所有從根節點開始的可達物件,未被標記的為垃圾物件(會出現磁碟碎片)。

(2)整理階段:將所有的存活物件壓縮到記憶體的一段(或向一端移動),之後清理邊界所有的空間

分代收集演算法:

只是根據物件存活週期的不同將記憶體劃分為幾塊。一般把java堆分為新生代和老年代。

新生代大量物件死亡,只有少數物件存活,採用複製演算法

老年代物件存活率高,沒有額外空間對它進行分配,故採用標記--清理或標記--整理演算法

三種演算法的比較:

  1)效率:複製演算法>標記/整理演算法>標記/清除演算法(此處的效率只是簡單的對比時間複雜度)

  2)記憶體整理度:複製演算法=標記/整理演算法》標記、清除演算法

  3)記憶體利用率:標記/整理演算法=標記/清除演算法》複製演算法

記憶體的分配

1、大多數新生的物件在Eden區分配,當Eden區沒有足夠空間進行分配時,虛擬機器就會進行一次

Minor GC.(Survivor是兩個)

 新生代:
    在方法中去new一個物件,那這方法呼叫完畢後,物件就會被回收,這就是一個典型的新生代物件。(新生物件在eden區經歷過一次minorG並且被Survivor容納的話,就物件年齡為1,每一次熬過MinorGc 就會年齡加1,直到15,就會晉升到老年代)

注意動態物件的判定:Survivor空間中相同年齡的物件大小總和大於Survivo空間的一半,大於或等於該年齡的物件就可以直接進入老年代。

老年代:

1)在新生代中經歷了N次垃圾回收後仍然存活的物件,就會被放到老年代中,而且大物件(大量連續記憶體空間的java物件如很長的字串及陣列)直接進入老年代。

2)當survivor空間不夠用時,需要依賴老年代進行分配擔保。

永久代:

   即方法區