Java垃圾回收器詳解
主要垃圾回收器分類
Java中的垃圾回收器可以根據不同的分類標準進行劃分:
-
按線程數分類:
- 串行垃圾回收器(Serial GC)
- 並行垃圾回收器(Parallel GC)
- 併發垃圾回收器(CMS, G1, ZGC, Shenandoah)
-
按工作區域分類:
- 新生代垃圾回收器(Serial, ParNew, Parallel Scavenge)
- 老年代垃圾回收器(Serial Old, Parallel Old, CMS)
- 全區域垃圾回收器(G1, ZGC, Shenandoah)
各垃圾回收器詳解
1. Serial 垃圾回收器
特點
- 單線程:只有一個GC線程執行垃圾回收
- 獨佔式:執行GC時暫停所有用户線程(Stop-The-World)
- 新生代:使用複製算法
- 老年代:對應Serial Old(標記-整理算法)
優點
- 實現簡單,內存佔用小
- 適用於單CPU環境下的客户端應用
- 對於內存較小的場景,停頓時間可控
缺點
- Stop-The-World時間長,不適用於服務器環境
- 不利用多核心CPU的優勢
參數設置
-XX:+UseSerialGC:啓用Serial收集器組合(Serial + Serial Old)
2. ParNew 垃圾回收器
特點
- Serial收集器的多線程版本
- 只應用於新生代,使用複製算法
- 可以與CMS配合工作
優點
- 多線程執行,充分利用多核CPU資源
- 比Serial收集器效率高
- 是CMS收集器的首選新生代收集器
缺點
- 仍然會產生Stop-The-World停頓
- 在單核心CPU上性能可能不如Serial收集器
參數設置
-XX:+UseParNewGC:啓用ParNew收集器-XX:ParallelGCThreads=N:設置GC線程數
3. Parallel Scavenge 垃圾回收器
特點
- 多線程並行收集
- 新生代使用複製算法
- 以吞吐量(Throughput)為目標的收集器
- 自適應調節策略(-XX:+UseAdaptiveSizePolicy)
優點
- 高吞吐量,適合後台計算任務
- 自適應調節功能,減少手動調優的工作量
- 精確控制吞吐量目標
缺點
- 仍然會產生Stop-The-World停頓
- 不能與CMS配合工作
參數設置
-XX:+UseParallelGC:啓用Parallel Scavenge收集器-XX:MaxGCPauseMillis=N:設置最大GC停頓時間-XX:GCTimeRatio=N:設置吞吐量目標(N為1/(1+N))
4. Serial Old 垃圾回收器
特點
- Serial收集器的老年代版本
- 單線程,使用標記-整理算法
- 主要作為CMS收集器的後備方案
優點
- 實現簡單,內存佔用小
- 適用於單CPU環境
缺點
- Stop-The-World時間長
- 不適合大內存服務器
參數設置
- 通常不單獨設置,與Serial收集器配合使用
5. Parallel Old 垃圾回收器
特點
- Parallel Scavenge的老年代版本
- 多線程並行收集,使用標記-整理算法
- 以吞吐量為目標
優點
- 高吞吐量
- 充分利用多核CPU資源
- 適合計算密集型應用
缺點
- 仍然會產生較長的Stop-The-World停頓
- 不適合對延遲敏感的應用
參數設置
-XX:+UseParallelOldGC:啓用Parallel Old收集器
6. CMS (Concurrent Mark Sweep) 垃圾回收器
特點
- 以低延遲為目標的併發收集器
- 老年代使用標記-清除算法
- 主要工作階段:初始標記、併發標記、重新標記、併發清除
- 其中初始標記和重新標記階段需要Stop-The-World
優點
- 低延遲,減少應用暫停時間
- 併發執行,不阻塞用户線程
- 適合對響應時間敏感的應用
缺點
- 對CPU資源敏感
- 無法處理浮動垃圾(Floating Garbage)
- 可能出現Concurrent Mode Failure
- 產生內存碎片
參數設置
-XX:+UseConcMarkSweepGC:啓用CMS收集器-XX:CMSInitiatingOccupancyFraction=N:設置老年代使用率閾值-XX:+UseCMSCompactAtFullCollection:Full GC時進行內存整理
7. G1 (Garbage First) 垃圾回收器
特點
- 面向服務器端應用的全區域收集器
- 將堆劃分為多個大小相等的區域(Region)
- 並行與併發結合
- 基於標記-整理算法,無內存碎片
- 可預測的停頓時間模型
優點
- 高吞吐量與低延遲的良好平衡
- 可預測的停頓時間
- 不產生內存碎片
- 適合大內存應用(內存>4GB)
缺點
- 內存佔用較大
- 複雜的實現和調優參數
- 小內存場景下性能可能不如其他收集器
參數設置
-XX:+UseG1GC:啓用G1收集器-XX:MaxGCPauseMillis=N:設置目標最大停頓時間-XX:G1HeapRegionSize=N:設置Region大小
8. ZGC (Z Garbage Collector)
特點
- Java 11引入的低延遲收集器
- 基於標記-複製算法
- 併發標記、併發轉移、併發重分配
- 暫停時間極短(通常<10ms)
- 支持TB級內存
優點
- 極低的停頓時間,適合對延遲極其敏感的應用
- 可擴展性好,支持大內存
- 幾乎不影響應用吞吐量
缺點
- 內存開銷較大(額外佔用20%左右內存)
- 需要較新的硬件和JDK版本
- 調優經驗相對較少
參數設置
-XX:+UseZGC:啓用ZGC收集器-XX:ZCollectionInterval=N:設置收集間隔(秒)
9. Shenandoah 垃圾回收器
特點
- Red Hat開發的低延遲收集器
- 基於標記-壓縮算法
- 併發執行大部分階段
- 暫停時間與堆大小基本無關
- 支持大內存(可擴展至TB級)
優點
- 極低的停頓時間
- 支持大內存應用
- 內存佔用相對較小
缺點
- 不是OpenJDK默認包含的收集器(部分廠商JDK提供)
- 併發執行需要消耗額外CPU資源
參數設置
-XX:+UseShenandoahGC:啓用Shenandoah收集器
垃圾回收器選擇指南
| 應用類型 | 推薦收集器 | 關鍵參數 |
|---|---|---|
| 桌面/客户端應用 | Serial | -XX:+UseSerialGC |
| 後台計算/批處理 | Parallel Scavenge/Parallel Old | -XX:+UseParallelOldGC |
| 響應時間敏感的Web應用 | CMS | -XX:+UseConcMarkSweepGC |
| 大內存、低延遲要求 | G1 | -XX:+UseG1GC |
| 超大內存、極低延遲要求 | ZGC/Shenandoah | -XX:+UseZGC |
總結
選擇合適的垃圾回收器需要考慮多方面因素:
- 應用場景:是桌面應用、Web服務還是批處理任務
- 硬件環境:CPU核心數、內存大小
- 性能目標:優先考慮吞吐量還是延遲
- JDK版本:不同版本支持的收集器不同
在實際應用中,通常需要通過基準測試和性能監控來確定最適合的垃圾回收器配置。