java -jar app.jar 啟動一個 JVM 實例。public static void main(String[]))。System.exit() / Runtime.getRuntime().halt() → 強制退出。守護線程:GC、JIT 編譯線程等;thread.setDaemon(true) 必須在 start() 前調用。

加載 .class 文件 → 驗證 → 準備 → 解析 → 初始化 → 可用。核心接口 ClassLoader。
Bootstrap ClassLoader (C++ 實現)
↑ 加載核心庫 (rt.jar/jrt-fs.jar)
Platform ClassLoader (Java 9+)
↑ 加載擴展/平台模塊
Application ClassLoader (AppClassLoader)
↑ 加載類路徑 (-cp) 應用類
Custom ClassLoader (用戶自定義)
↑ 隔離插件、熱部署、加密類等
Thread.contextClassLoader)。| 區域 | 線程共享? | 生命周期 | 核心內容 | OOM 風險 |
|---|---|---|---|---|
| 堆 | ✅ 所有線程共享 | JVM 啟動~關閉 | 對象實例、數組、字符串常量池 (JDK 7+) | 高:-Xmx 限制 |
| 方法區 | ✅ 共享 | JVM 啟動~關閉 | 類元數據、常量池、靜態變量、即時編譯代碼緩存 | 中:-XX:MaxMetaspaceSize |
| Java 虛擬機棧 | ❌ 線程私有 | 線程創建~結束 | 棧幀:局部變量表、操作數棧、動態連接、方法返回地址 | 中:-Xss 限制 |
| 本地方法棧 | ❌ 線程私有 | 線程創建~結束 | Native 方法調用狀態 (JNI) | 低 |
| 程序計數器 | ❌ 線程私有 | 線程創建~結束 | 當前執行字節碼指令地址 | 無(極小) |
Heap
├── Young Generation (新生代)
│ ├── Eden Space (伊甸區) -- 新對象分配主區
│ ├── Survivor Space S0 (From) -- Minor GC 存活對象
│ └── Survivor Space S1 (To) -- 輪換
└── Old Generation (老年代) -- 長期存活對象晋升
(JDK 8-) PermGen (永久代) → (JDK 8+) Metaspace (元空間, 直接內存)
this、方法參數、局部變量(Slot,32位),long/double 佔 2 Slot。iadd 彈出兩個 int 相加壓入結果。| 收集器 | 代 | 算法 | 特點 | 適用場景 |
|---|---|---|---|---|
| Serial | 新/老 | 複製/標記整理 | 單線程、Client 模式默認 | 單核、小內存 |
| Parallel Scavenge | 新 | 複製 | 多線程、吞吐量優先 | 批處理、科學計算 |
| CMS | 老 | 標記清除 | 並發標記、低停頓、碎片化 | 響應敏感應用 (JDK 14 移除) |
| G1 | 混合 | 標記整理+區域化 | 可預測停頓、Region 分區、大對象 Humongous | JDK 9+ 默認、大堆 (6G+) |
| ZGC / Shenandoah | 混合 | 並發整理、着色指針/轉發指針 | 亞毫秒停頓、TB 級堆 | 超大堆、極低延遲要求 |
| 區域 | 大小 | 說明 |
|---|---|---|
| 對象頭 | 16 Bytes | Mark Word (12B) + Klass Pointer (4B, 壓縮) |
| 實例數據 | 實例變量大小 | 按聲明順序/分配策略排列,對齊補齊 8 Bytes |
| 對齊填充 | 0~7 Bytes | 確保對象起始地址 8 Bytes 對齊 |
| 無鎖 (25b Hash | 4b Age | 2b 0 | 1b 01) |
| 偏向鎖 (23b ThreadID | 2b Epoch | 4b Age | 1b 1 | 1b 01) |
| 輕量級鎖 (62b 指向棧中 Lock Record | 2b 00) |
| 重量級鎖 (62b 指向 ObjectMonitor | 2b 10) |
| GC 標記 (62b 空 | 2b 11) |
ObjectMonitor,依賴 OS 互斥量,線程阻塞/喚醒涉及用戶態↔內核態切換。-Xms4g -Xmx4g # 堆固定 4G,避免動態伸縮
-XX:+UseG1GC # 啟用 G1
-XX:MaxGCPauseMillis=200 # 目標停頓 200ms
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/heap.hprof
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-Xss1m # 棧大小 1M (默認 1M, 深遞歸可調大)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xlog:gc*:/logs/gc.log (JDK 9+)
JVM 是 Java「一次編寫,到處運行」的基石。理解類加載雙親委派、運行時數據區分代模型、JIT 分層編譯、GC 演進脈絡、鎖升級機制五大核心,能從根本上定位內存洩漏、CPU 飆高、停頓抖動等生產疑難雜症。建議開發者熟練使用 jstat、jmap、jstack、arthas、JMC/JFR 等診斷工具,建立「觀測 → 分析 → 調優」閉環能力。