博客 / 詳情

返回

Java垃圾回收器詳解

Java垃圾回收器詳解

主要垃圾回收器分類

Java中的垃圾回收器可以根據不同的分類標準進行劃分:

  1. 按線程數分類

    • 串行垃圾回收器(Serial GC)
    • 並行垃圾回收器(Parallel GC)
    • 併發垃圾回收器(CMS, G1, ZGC, Shenandoah)
  2. 按工作區域分類

    • 新生代垃圾回收器(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

總結

選擇合適的垃圾回收器需要考慮多方面因素:

  1. 應用場景:是桌面應用、Web服務還是批處理任務
  2. 硬件環境:CPU核心數、內存大小
  3. 性能目標:優先考慮吞吐量還是延遲
  4. JDK版本:不同版本支持的收集器不同

在實際應用中,通常需要通過基準測試和性能監控來確定最適合的垃圾回收器配置。

user avatar madrid 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.