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

JVM GC 算法與收集器全景圖:從 Copying 到 G1 的演進與選型指南

     編輯:Java 程式設計入門

垃圾收集(GC)是 JVM 自動記憶體管理的核心。本文系統梳理三大經典算法、分代收集理論、主流收集器組合,重點剖析 G1 收集器原理與調優參數,助你根據應用特徵選擇最優 GC 方案。

一、三大基礎算法

算法核心思想優點缺點適用場景
標記-清除
(Mark-Sweep)
標記存活對象,統一清除未標記區域實現簡單,無需移動對象1. 效率低(雙掃描)
2. 產生記憶體碎片
老年代(配合壓縮)
複製
(Copying)
劃分兩塊等大區域,每次用一塊,存活對象複製到另一塊,清空已用區無碎片,分配只需移動指針,極快浪費 50% 空間;存活率高時複製開銷大新生代(存活率低)
標記-整理
(Mark-Compact)
標記後,存活對象向一端移動,清理邊界外記憶體無碎片,空間利用率高需移動對象、更新引用,耗時較長老年代

複製算法 標記-整理算法

二、分代收集理論

核心假設:絕大多數對象「朝生夕死」,只有少量長期存活。

  • 新生代:對象死亡率高 → 複製算法(Eden + 兩個 Survivor,默認 8:1:1)。
  • 老年代:存活率高、無額外空間擔保 → 標記-清除/整理。

分代堆佈局 新生代結構 老年代結構

三、G1 收集器:面向未來的區域化分代收集

目標:替代 CMS,兼顧吞吐與低延遲,支援可預測停頓模型。

核心特性

  • 區域化堆:堆劃分為大小相等的 Region(1-32MB),新生代/老年代不再物理連續,而是 Region 集合。G1 堆區域
  • 標記-整理:整體無碎片,大對象分配不易觸發 Full GC。
  • 可預測停頓:用戶指定 -XX:MaxGCPauseMillis=N,G1 動態調整回收集合(CSet)大小以滿足目標。
  • 混合收集:Young GC 同時回收部分老年代 Region(按活性排序),避免 Full GC。

G1 完整收集週期

  1. 初始標記 (Initial Mark):STW,標記 GC Roots 直接可達對象,伴隨 Young GC。GC pause (young) (initial-mark)
  2. Root Region 掃描:掃描 Survivor→Old 的引用,必須在下次 Young GC 前完成。
  3. 並發標記 (Concurrent Marking):與應用並發,掃描整個堆,計算 Region 活性。發現全垃圾 Region 立即回收。並發標記
  4. 再標記 (Remark):STW,處理並發階段產生的新垃圾,採用 SATB(原始快照)算法比 CMS 更快。再標記
  5. 清理/複製 (Cleanup/Copy):STW,多線程將 CSet 存活對象複製到新 Region,清理 Remembered Sets,回收 Region 歸入空閒鏈表。清理後

四、主流收集器組合選型表

組合新生代老年代特點適用場景
SerialSerialSerial Old單線程,開銷最小Client 模式、單核、嵌入式
ParNew + CMSParNewCMS低延遲,並發收集老年代舊版高併發 Web、響應敏感應用
Parallel Scavenge + Parallel OldParallelParallel Old吞吐優先,多線程並行批處理、科學計算、後台任務
G1G1 YoungG1 Old/Mixed區域化、可預測停頓、大堆友好JDK 9+ 默認,6GB+ 堆、低延遲要求
ZGC / Shenandoah--亞毫秒級停頓,彩色指針/連接矩陣超大堆(TB 級)、極致低延遲(JDK 11+)

五、實戰調優建議

  1. 小堆(<4GB)、吞吐優先:-XX:+UseParallelGC
  2. 中堆(4-8GB)、延遲敏感:-XX:+UseG1GC -XX:MaxGCPauseMillis=100
  3. 大堆(>8GB)、嚴格 SLA:-XX:+UseZGC(JDK 11+)或 -XX:+UseShenandoahGC
  4. 避免顯式 System.gc():信任收集器決策,必要時用 -XX:+DisableExplicitGC。
  5. 監控指標:GC 頻率、停頓分佈、老年代增長率、Full GC 觸發原因(-Xlog:gc*)。

參考資源

  • 《深入理解 Java 虛擬機》第 3 版 - 周志明
  • Oracle GC Tuning Guide
  • OpenJDK G1GC 源碼與設計文檔
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved