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

JVM 核心原理與 GC 調優實戰:從類載入到 G1/ZGC 新世代收集器深度解析

     編輯:Java 綜合教學

JVM 啟動流程

  1. java 命令啟動 JavaMain → CreateJavaVM
  2. 解析 -Xms/-Xmx 等參數,建立 VM 結構體
  3. 載入 jvm.dll (HotSpot),初始化 JNI 接口
  4. Bootstrap ClassLoader 載入核心類 (java.lang.*)
  5. Ext/Application ClassLoader 載入擴展/應用類
  6. 執行 main(),進入應用邏輯

記憶體模型 (JDK 8+)

+--------------------------+
|       Heap (堆)          |
|  +------------------+    |
|  | Young Generation |    |  <- 新生代:Eden + S0 + S1
|  |  Eden  | S0 | S1 |    |
|  +------------------+    |
|  | Old Generation   |    |  <- 老年代
|  +------------------+    |
+--------------------------+
|   Metaspace (元空間)      |  <- 類元資料,替代 PermGen
+--------------------------+
|   Thread Stacks          |  <- -Xss 每執行緒堆疊
+--------------------------+
|   Direct Memory          |  <- -XX:MaxDirectMemorySize
+--------------------------+

GC 演算法基石

演算法原理優點缺點適用區
標記-清除標記存活 → 清除未標記實作簡單記憶體碎片老年代
複製劃分兩區,存活物件複製無碎片、分配快浪費 50% 空間新生代
標記-整理標記 → 壓縮存活物件無碎片移動物件開銷大老年代
分代收集依物件壽命分代,不同演算法綜合效能最優複雜度高全堆

七大收集器演進

  • Serial:單執行緒,Client 模式預設
  • ParNew:Serial 多執行緒版,常搭配 CMS
  • Parallel Scavenge:吞吐量優先,自適應調節
  • Serial Old:Serial 老年代版
  • Parallel Old:Parallel Scavenge 老年代版
  • CMS:低延遲,標記-清除,碎片問題,JDK 9 棄用
  • G1:分區域、混合收集、可預測停頓,JDK 9+ 預設
  • ZGC / Shenandoah:亞毫秒級停頓、彩色指針/連接矩陣,JDK 11+/12+

生產環境調優模板 (JDK 17+ G1/ZGC)

# G1 通用模板 (堆 4G-32G)
-Xms8g -Xmx8g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
-XX:+ParallelRefProcEnabled
-XX:+UnlockExperimentalVMOptions

# ZGC 超大堆/低延遲 (32G+)
-Xms64g -Xmx64g
-XX:+UseZGC
-XX:ZCollectionInterval=120
-XX:+ZGenerational  # JDK 21+ 分代 ZGC

# 通用診斷參數
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags:filecount=10,filesize=100m
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumps/

故障診斷工具鏈

工具用途典型命令
jstatGC 統計監控jstat -gcutil -h10 <pid> 2000
jmap堆快照/物件統計jmap -histo:live <pid> | head -30
jstack執行緒快照/死鎖分析jstack -l <pid> > threaddump.txt
jcmd診斷命令大全jcmd <pid> GC.run / VM.flags
Arthas線上動態追蹤java -jar arthas-boot.jar
JVisualVM / JMC圖形化分析GUI 操作

OOM 常見類型與對策

  • Java Heap Space:增大 -Xmx、檢查記憶體洩漏 (MAT 分析 jmap -dump)
  • Metaspace:增大 -XX:MaxMetaspaceSize、類載入洩漏 (動態代理、JSP 重編譯)
  • Direct Memory:增大 -XX:MaxDirectMemorySize、Netty/ByteBuffer 未釋放
  • Stack Overflow:遞迴過深、-Xss 過小
  • GC Overhead Limit Exceeded:GC 佔 CPU > 98% 且回收 < 2%,調大堆或優化物件分配率
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved