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

JVM 垃圾收集器全解析:從 Serial 到 G1 的演進與選型

     編輯:Java 綜合教學

HotSpot GC 體系概覽

JVM 規範未強制 GC 實現,HotSpot 提供多款收集器組合,按代劃分:新生代(Serial、ParNew、Parallel Scavenge)、老年代(Serial Old、Parallel Old、CMS、G1)。收集器間連線表示可搭配使用。

新生代收集器

Serial Collector

  • 單線程、複製算法、Stop-The-World
  • 優點:無線程交互開銷,單 CPU 環境最高效
  • 適用:Client 模式、單核、嵌入式場景

ParNew Collector

  • Serial 多線程版,複製算法
  • 唯一除 Serial 外能與 CMS 搭配的新生代收集器
  • 參數:-XX:+UseParNewGC

Parallel Scavenge Collector

  • 多線程、複製算法,關注吞吐量
  • 吞吐量 = 用戶代碼時間 / (用戶代碼時間 + GC 時間)
  • 自適應調節:-XX:+UseAdaptiveSizePolicy 自動調整堆區大小
  • 控制參數:-XX:MaxGCPauseMillis(最大停頓)、-XX:GCTimeRatio(吞吐量目標)
  • 適用:後台批處理、科學計算、無交互業務

老年代收集器

Serial Old

  • 單線程、標記-整理算法
  • 用途:JDK 1.5 前與 Parallel Scavenge 搭配;CMS 失敗後備方案

Parallel Old

  • Parallel Scavenge 老年代版,多線程、標記-整理
  • 組合 Parallel Scavenge + Parallel Old:吞吐量優先首選
  • 參數:-XX:+UseParallelOldGC

CMS (Concurrent Mark Sweep)

  • 目標:最短停頓時間,基於標記-清除算法
  • 四階段:初始標記(STW) → 並發標記 → 重新標記(STW) → 並發清除
  • 優點:用戶線程並發執行,低延遲
  • 缺點:
    • CPU 敏感,佔用核心資源
    • 浮動垃圾導致 Concurrent Mode Failure 觸發 Full GC
    • 內存碎片,需 -XX:+UseCMSCompactAtFullCollection 整理
  • 參數:-XX:+UseConcMarkSweepGC

G1 (Garbage-First)

  • 面向服務端,JDK 9+ 默認收集器
  • 特性:
    • 並行並發:多 CPU 縮短 STW
    • 分代收集:保留新/老年代邏輯,但物理不連續
    • 空間整合:整體標記-整理,局部複製,無碎片
    • 可預測停頓:指定 -XX:MaxGCPauseMillis,建立時間模型
  • 堆劃分為多個等大 Region,新/老年代為 Region 集合
  • Remembered Set (RSet) 記錄跨 Region 引用,避免全堆掃描
  • 四階段:初始標記(STW) → 並發標記 → 最終標記(STW) → 篩選回收(可並發)
  • 參數:-XX:+UseG1GC

收集器選型指南

場景推薦組合JVM 參數
單核/小內存/ClientSerial + Serial Old-XX:+UseSerialGC
多核/高吞吐/批處理Parallel Scavenge + Parallel Old-XX:+UseParallelGC
多核/低延遲/交互應用ParNew + CMS-XX:+UseConcMarkSweepGC
大內存(>6G)/低延遲/可預測G1-XX:+UseG1GC

核心概念補充

  • Stop-The-World:所有工作線程暫停,只有 GC 線程運行
  • 安全點:線程可安全暫停的位置(方法調用、循環跳轉、異常跳轉)
  • 安全區域:代碼片段中引用關係不變,可安全 GC(如睡眠、阻塞)
  • 記憶集/卡表:老年代→新生代引用記錄,Young GC 時掃描卡表而非全老年代
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved