【理解HotSpot虛擬機器】GC垃圾收集器的對比分析
阿新 • • 發佈:2019-01-23
1 概述
目前,JVM中有四種類型的垃圾收集器。一開始接觸HotSpot的垃圾收集器,很容易被許多的名字混淆,《深入理解Java虛擬機器》中給每種垃圾收集起了名字(下表第二列),對應在HotSpot中的實現類(下表第三列)
型別 | 名稱 | jvm的實現類 | 代 |
---|---|---|---|
1 序列垃圾收集器 | Serial收集器 | def new generation | 新生代 |
1 序列垃圾收集器 | Serial Old收集器 | tenured generation | 老年代 |
2 並行垃圾收集器 | ParNew收集器 | par new generation | 新生代 |
2 並行垃圾收集器 | Parallel Scavenge收集器 | PSYoungGen | 新生代 |
2 並行垃圾收集器 | Parallel Old收集器 | ParOldGen | 老年代 |
3 併發標記掃描垃圾收集器 | CMS收集器 | concurrent mark-sweep generation | 老年代 |
4 G1垃圾收集器 | G1收集器 | garbage-first heap | 均可 |
每種型別的垃圾收集器有它的特點,以及使用範圍,下面逐一介紹。
2 序列垃圾回收器
序列垃圾收集器GC示意圖
序列垃圾回收器有兩個:
- Serial收集器:新生代,複製演算法
- Serial Old收集器:老年代,標記-整理演算法
優點:
- 實現簡單
- 適用於簡單的命令列程式和Client模式
缺點:
- Stop the world 時間較長
3 並行垃圾收集器
並行垃圾收集器GC示意圖
並行垃圾回收器有三個:
- ParNew收集器:新生代,複製演算法,跟Serial收集器基本一樣,只是多執行緒版本,CMS收集器最佳搭配
- Parallel Scavenge收集器:新生代,複製演算法,基於吞吐量優化,具備自適應調節策略
- Parallel Old收集器:老年代,標記-整理演算法,基於吞吐量優化
優點:
- 在多CPU環境下,比Serial收集器要高效
- Parallel Scavenge收集器和Parallel Old收集器高效率利用CPU時間,適用於後臺運算,少互動情況
缺點:
- 仍存在Stop the world 時間較長問題,不能併發GC
4 併發標記掃描垃圾收集器
CMS收集器GC示意圖
CMS是基於最短停頓時間,應用於老年代,標記-清除演算法的收集器,包括4個步驟:
- 初始標記:僅標記GC Root能直接關聯到的物件
- 併發標記:進行GC Root Trancing
- 重新標記:修正併發標記期間,因使用者程式執行導致的標記變動的那部分物件的標記記錄
- 併發清除:清除物件
優點:
- 大部分時間可與使用者執行緒併發執行,停頓時間小
缺點:
- CMS收集器非常佔用CPU資源
- 無法處理在併發清除期間新出現的垃圾(浮動垃圾)
- 基於標記-清除演算法,會產生許多碎片
5 G1垃圾收集器
G1收集器GC示意圖
G1的垃圾收集過程與CMS十分相似。主要不同在於G1將整個Java堆劃分為多個大小相等的獨立區域(Region),新生代和老年代不再是物理上連續的,而是邏輯上連續的。
優點:
- 同時實現了並行與併發,並行指多個執行緒同時進行。併發指能與使用者執行緒同時進行
- 空間整合:整體看是“標記-整理“演算法,區域性看是“複製“演算法
- 可預測停頓時間
缺點:
- 實現複雜
6 總結
新生代、老年代的垃圾收集器有許多,常見的搭配有一下四種:
JVM引數 | 新生代 | 老年代 |
---|---|---|
-XX:+UseSerialGC | Serial | Serial Old |
-XX:+UseParallelGC -XX:+UseParallelOldGC | Parallel Scavenge | Parallel Old |
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC | ParNew | CMS |
-XX:+UseG1GC | G1 | G1 |
7 參考
《深入理解Java虛擬機器》——周志明