jvm--垃圾收集器與記憶體分配策略
標記—清除演算法
(1)標記階段:先通過根節點,標記所有從根節點開始的物件,未被標記的為垃圾物件
(2)清除階段:清除所有未被標記的物件
複製演算法:
將原有的記憶體空間分成兩塊,每次只使用其中一塊,在垃圾回收時,將正在使用的記憶體中的存活物件複製到未使用的記憶體塊中,然後清除正在使用的記憶體塊中的所有物件。
標記—整理演算法:(若物件存活率比較高,就要進行多次複製,效率比較低)
(1)標記階段:先通過根節點,標記所有從根節點開始的可達物件,未被標記的為垃圾物件(會出現磁碟碎片)。
(2)整理階段:將所有的存活物件壓縮到記憶體的一段(或向一端移動),之後清理邊界所有的空間
分代收集演算法:
只是根據物件存活週期的不同將記憶體劃分為幾塊。一般把java堆分為新生代和老年代。
新生代大量物件死亡,只有少數物件存活,採用複製演算法
老年代物件存活率高,沒有額外空間對它進行分配,故採用標記--清理或標記--整理演算法
三種演算法的比較:
(1)效率:複製演算法>標記/整理演算法>標記/清除演算法(此處的效率只是簡單的對比時間複雜度)
(2)記憶體整理度:複製演算法=標記/整理演算法》標記、清除演算法
(3)記憶體利用率:標記/整理演算法=標記/清除演算法》複製演算法
記憶體的分配
1、大多數新生的物件在Eden區分配,當Eden區沒有足夠空間進行分配時,虛擬機器就會進行一次
新生代:
在方法中去new一個物件,那這方法呼叫完畢後,物件就會被回收,這就是一個典型的新生代物件。(新生物件在eden區經歷過一次minorG並且被Survivor容納的話,就物件年齡為1,每一次熬過MinorGc
就會年齡加1,直到15,就會晉升到老年代)
注意動態物件的判定:Survivor空間中相同年齡的物件大小總和大於Survivo空間的一半,大於或等於該年齡的物件就可以直接進入老年代。
老年代:
(1)在新生代中經歷了N次垃圾回收後仍然存活的物件,就會被放到老年代中,而且大物件(大量連續記憶體空間的java物件如很長的字串及陣列)直接進入老年代。
(2)當survivor空間不夠用時,需要依賴老年代進行分配擔保。
永久代:
即方法區