JVM 啟動流程
java 命令啟動 JavaMain → CreateJavaVM
- 解析
-Xms/-Xmx 等參數,建立 VM 結構體
- 載入
jvm.dll (HotSpot),初始化 JNI 接口
- Bootstrap ClassLoader 載入核心類 (
java.lang.*)
- Ext/Application ClassLoader 載入擴展/應用類
- 執行
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/
故障診斷工具鏈
| 工具 | 用途 | 典型命令 |
| jstat | GC 統計監控 | 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%,調大堆或優化物件分配率