JVM 是 Java 程序運行的基石。本文從 JVM 規范與實現、運行時數據區、類加載機制、對象生命週期、垃圾回收演算法、核心調優參數五大維度,系統梳理 JVM 核心知識體系,並提供生產環境調優實戰建議。
.java → .class 字節碼。ClassLoader 讀取字節碼 → 方法區存儲類元數據 → 堆創建 java.lang.Class 對象。

| 區域 | 線程 | 功能 | 異常 |
|---|---|---|---|
| 程序計數器 | 私有 | 當前字節碼行號指示器 | 無 |
| 虛擬機棧 | 私有 | 方法調用幀(局部變量表、操作數棧、動態鏈接、返回地址) | StackOverflowError / OOM |
| 本地方法棧 | 私有 | Native 方法調用 | 同上 |
| 方法區 / 元空間 | 共享 | 類元數據、常量、靜態變量、JIT 編譯代碼 (JDK 8+ 移至元空間,直接內存) | OOM (Metaspace) |
| 堆 | 共享 | 對象實例分配、GC 主戰場 | OOM (Java Heap) |

<init> (構造器鏈:父類 static → 父類字段/構造 → 子類字段/構造)。| 算法 | 適用區 | 特點 |
|---|---|---|
| 標記-清除 | 老年代 | 碎片多 |
| 標記-整理 | 老年代 | 無碎片,移動對象 |
| 復制 | 新生代 | 無碎片,浪費 50% 空間 (Eden:Survivor=8:1:1 實際利用 90%) |
| 分代收集 | 整體 | 新生代復制 + 老年代標記整理 |
| 參數 | 含義 | 建議 |
|---|---|---|
| -Xms / -Xmx | 堆初始/最大大小 | 設為相同值,避免動態伸縮抖動,通常設物理內存 60-80% |
| -Xmn | 新生代大小 | 整體堆 1/3 ~ 1/2,配合 -XX:SurvivorRatio |
| -XX:NewRatio | 老年代/新生代比例 | 默認 2 (老年代:新生代=2:1) |
| -XX:SurvivorRatio | Eden/Survivor 比例 | 默認 8 (Eden:S0:S1=8:1:1) |
| -XX:MaxTenuringThreshold | 晉升老年代年齡閾值 | 默認 15,視對象存活特性調整 |
| -XX:+UseG1GC | 啟用 G1 | JDK 9+ 默認,大堆 (>4G) 低延遲首選 |
| -XX:MaxGCPauseMillis | G1 目標停頓 | 默認 200ms,業務敏感可降至 50-100ms |
| -XX:+HeapDumpOnOutOfMemoryError | OOM 導出堆快照 | 生產必開,配合 -XX:HeapDumpPath |
| -XX:+PrintGCDetails -Xlog:gc* | GC 日誌 | JDK 8 用前者,JDK 9+ 用統一日誌 -Xlog:gc*:file=gc.log:time,uptime,level,tags |
GCViewer、GCEasy、Arthas、JVisualVM、JConsole。JVM 調優無銀彈,核心在於理解業務對象特性(大小、存活時間、分配速率),選擇合適收集器與參數,讓 GC「少跑、快跑、不跑」。