java垃圾收集器和回收策略

一 垃圾收集器

1 serial收集器
特點:單線程串行收集,gc收集的時候會暫停用戶線程 stop the world, 簡單高效
缺點:gc收集暫停的時間長
適用:新生代默認的垃圾收集器
算法:複製算法

2 parnew收集器
特點:除了多線程外,其餘和serial收集器一樣; 只有他可以和cms收集器配合工作
適用:新生代
算法:複製算法

3 parallel scavenge收集器
特點:多線程並行收集,gc收集的時候會暫停用戶線程; 關注吞吐量
適用:新生代
算法:複製算法

4 serial old收集器
特點:單線程串行收集,gc收集的時候會暫停用戶線程;類似serial收集器
適用:老年代
算法:標記-整理算法

5 parallel old收集器
特點:多線程並行收集;類似parallel scavenge收集器
適用:老年代
算法:標記-整理算法

6 cms收集器
特點:以獲取最短暫停時間爲目標,來提高用戶響應時間; 內存回收過程和用戶線程是一起併發執行的。
適用:老年代
算法:標記-清除算法

7 G1收集器 (jdk7後使用)
特點:既滿足減少垃圾收集暫停時間,有具備高吞吐量(cpu利用率)
算法:標記-整理算法
適用:分代管理,能夠管理新生代和老年代,而不用搭配其他收集器

總結:
1 一般都是一個新生代收集器搭配一個老年代收集器一起使用,只有parnew可以和cms搭配使用,G1可以單獨使用;
2 並行和併發的區別是: 並行的時候會暫停用戶線程,併發的時候不暫停用戶線程
3 串行收集器單線程高效但犧牲了用戶響應時間,並行收集器關注吞吐量,cms關注垃圾收集停頓時間
4 吞吐量和暫停時間的區別:
吞吐量: 程序線程用時佔程序總用時的比例 =用戶代執行碼時間/(用戶代碼執行時間 + 垃圾收集時間)
暫停時間:垃圾串行、並行收集時,程序線程會被暫停處於等待狀態

二 回收策略

1 新創建對象存放在eden區
過程:
1)新創建對象都存放到新生代eden區
2)當經過第一個GC時,會根據複製算法把存活的對象複製到其中一個s區,另一個s區和eden區清空

Minor GC: 新生代回收動作, 回收速度比較頻繁
Major GC/Full GC: 老年代垃圾回收動作, 速度比Minor GC慢10倍以上

2 長期存活的對象將進入老年代
簡介:虛擬機爲每個對象定義一個age計數器,每經過一次minor gc存活下來,計數器加1,當年齡達到設置參數時,會進入到老年代中。
參數:-XX:MaxTenuringThreshold 對象進入老年代的年齡閥值

4 動態對象年齡判定
當s區中相同年齡所有對象大小總和大於s區空間的一半,年齡等於後者大於該年齡的對象會直接進入到老年代中。
此時不需要等到年齡達到MaxTenuringThreshold閥值就可以觸發轉化。

5 大對象直接分配到老年代
-XX:PretenureSizeThreshold參數:
1)當創建的對象超過這個參數直接在老年代中分配
2)參數只對serial和parNew收集器有效

6 空間分配擔保
新生代minor gc後s區不足以存儲剩餘存活的對象,會把一部分對象分配到老年代中,類似自身條件不足複用其他空間使其爲自己擔保。

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