首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JVM 垃圾收集器詳解:六大收集器特性、組合策略與場景選型

     編輯:Java 相關知識

Client vs Server 模式

  • Client 模式:啟動快,適合開發/桌面應用,默認 Serial GC
  • Server 模式:啟動慢,運行時優化多,長期運行性能優,默認 Parallel GC,需 -server 啟用

六大收集器詳細特性

1. Serial Collector (串行)

  • 算法:復制算法 (新生代) / 標記-整理 (年老代)
  • 線程:單線程
  • 停頓:Stop-the-world 全程暫停
  • 優點:實現簡單,無線程開銷,Client 模式默認
  • 缺點:停頓長,不適用大堆
  • 參數:-XX:+UseSerialGC

2. ParNew Collector (並行新生代)

  • 算法:復制算法
  • 線程:多線程並行
  • 停頓:Stop-the-world,但並行縮短時間
  • 敏感性:依賴多核 CPU,單核下性能反而較 Serial 差
  • 參數:-XX:+UseParNewGC,-XX:ParallelGCThreads=N
  • 搭配:僅能與 CMS 配合 (Serial Old 備用)

3. Parallel Scavenge (並行吞吐量優先)

  • 算法:復制算法
  • 特點:可精確控制吞吐量與停頓時間
  • 關鍵參數:
    • -XX:MaxGCPauseMillis:最大停頓目標
    • -XX:GCTimeRatio:吞吐量目標 (如 99 = 1% GC 時間)
    • -XX:+UseAdaptiveSizePolicy:自適應調節新生代、Survivor、晉升年齡
  • 搭配:Parallel Old (JDK 6+ 默認)
  • 參數:-XX:+UseParallelGC (Server 模式默認)

4. Parallel Old (並行年老代)

  • 算法:標記-整理
  • 線程:多線程並行
  • 意義:Parallel Scavenge 唯一搭檔,避免 Serial Old 拖累吞吐量
  • 參數:JDK 6+ 開啟 Parallel GC 自動啟用

5. CMS Collector (並發標記清除)

  • 算法:標記-清除
  • 目標:最短停頓時間
  • 四階段:
    1. 初始標記 (STW) - 快速標記 GC Roots 直接可達
    2. 並發標記 - 並發追蹤可達對象
    3. 重新標記 (STW) - 修正並發階段變動
    4. 並發清除 - 並發回收垃圾
  • 優點:停頓極短,適合響應時間敏感應用
  • 缺點:
    • CPU 佔用高 (併發階段佔用核心)
    • 內存碎片 (標記-清除不整理)
    • 並發模式失敗 → 觸發 Serial Old Full GC
  • 參數:-XX:+UseConcMarkSweepGC

6. Serial Old (串行年老代)

  • Serial 的年老代版本,標記-整理,單線程,CMS 失敗時的備用方案

三大經典組合對比

組合新生代年老代特點適用場景
Serial + Serial OldSerialSerial Old單線程,簡單,Client 默認小應用、桌面、開發測試
Parallel Scavenge + Parallel OldParallel ScavengeParallel Old全並行,高吞吐,可控目標批處理、數據分析、後台計算
ParNew + CMSParNewCMS (Serial Old 備用)低停頓,併發回收Web 應用、API 服務、實時系統

其他三種組合為何少用

  • Serial + CMS:新生代單線程成瓶頸
  • ParNew + Parallel Old:不兼容
  • Parallel Scavenge + CMS:不兼容

選型決策樹


是否單核/小堆/開發測試? → UseSerialGC
否
  是否批處理/高吞吐/停頓不敏感? → UseParallelGC
  否
    是否 Web/低延遲/響應時間敏感? → UseConcMarkSweepGC
    否
      大內存 (6G+) / 可接受 JDK 9+? → UseG1GC / UseZGC

CMS 關鍵調優點

  1. 降低觸發閾值:CMSInitiatingOccupancyFraction=60-70,預留足夠空間給併發回收
  2. 碎片整理:UseCMSCompactAtFullCollection=true + CMSFullGCsBeforeCompaction=5
  3. 縮短 Remark:CMSParallelRemarkEnabled=true + CMSScavengeBeforeRemark=true
  4. 避免併發失敗:監控 Concurrent Mode Failure,調大年老代或降低觸發閾值

總結

六大收集器無絕對優劣,只有場景適配。理解各收集器算法、線程模型、停頓特性、參數調節機制,是 JVM 調優核心技能。現代應用 (JDK 11+) 推薦優先評估 G1/ZGC,但掌握 CMS/Parallel 經典組合原理對診斷歷史系統、理解 GC 演進至關重要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved