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

JVM 調優總結(六):分代垃圾回收詳述與收集器選型指南(下)

     編輯:Java 相關知識

分代 GC 流程圖解

新生代 Eden/Survivor 複製流程 Survivor 區雙向複製 對象晉升老年代 老年代標記清除/整理

三大收集器深度對比

1. 串行收集器 (Serial GC)

Serial GC

  • **單線程**完成所有 GC 工作,無線程切換開銷,單線程效率最高。
  • **適用**:單核 CPU、小堆(~100MB)、Client 模式、無響應要求。
  • 參數:-XX:+UseSerialGC

2. 並行收集器 (Parallel Scavenge / Parallel Old)

Parallel GC

  • **多線程並行**回收新生代(Parallel Scavenge),JDK 6+ 支持老年代並行(Parallel Old)。
  • **目標**:**最大吞吐量** = (用戶代碼時間) / (總時間)。
  • **可控指標**:
    • -XX:MaxGCPauseMillis:目標最大停頓(自動調整堆結構)。
    • -XX:GCTimeRatio:吞吐量目標(默認 99 → 1% GC 時間)。
  • **適用**:多核、批處理、科學計算、後台任務、無實時響應要求。
  • 參數:-XX:+UseParallelGC -XX:ParallelGCThreads=n

3. 並發收集器 (CMS - Concurrent Mark Sweep)

CMS GC

  • **核心目標**:**最小化停頓時間**,大部分工作與應用線程**並發執行**。
  • **流程**:初始標記(STW) → 並發標記 → 重新標記(STW) → 並發清除 → 並發重置。
  • **代價**:
    • 佔用 CPU 資源(並發階段佔 K/N 核心,通常 1≤K≤N/4)。
    • **浮動垃圾**:並發期間新產生的垃圾只能下輪回收,需預留 20% 空間。
    • **碎片**:標記-清除不壓縮,長期運行產生碎片 → 分配大對象失敗 → 觸發 **Concurrent Mode Failure** 退化為串行 Full GC(災難性停頓)。
  • **啟動時機**:-XX:CMSInitiatingOccupancyFraction 設置老年代佔用百分比觸發(默認自適應)。
  • **適用**:Web 服務、API 閘道、電信交換、IDE——**響應時間敏感、多核、中大堆**。
  • 參數:-XX:+UseConcMarkSweepGC -XX:+UseParNewGC

選型決策表

| 應用類型 | 推薦收集器 | 核心理由 | |----------|------------|----------| | 單核 / 小堆 / 測試 | Serial | 開銷最小 | | 批處理 / 科學計算 / 後台任務 | **Parallel GC** | 吞吐量最高,多核並行 | | Web / API / 即時系統 / 高併發服務 | **CMS / G1** | 停頓可控,用戶體驗優先 | | 超大堆 (>8GB) / 混合負載 | **G1** | Region 級回收,停頓可預期 |

總結

  • **沒有銀彈**,只有適合業務 SLA 的收集器。
  • **先定 SLA**(最大停頓、吞吐量),再選收集器、調參數。
  • **監控 GC 日志**,觀察實際停頓分佈、頻率、老年代增長趨勢,持續微調。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved