Java 虛擬機 (JVM) 是 Java 平台無關性的基石。本文系統性解析 JVM 架構:類檔案格式、類載入子系統、執行時資料區、指令集與執行引擎、原生介面、Java 晶片發展史,建立完整的 JVM 心智模型。
| 類別 | 型別 | 大小 | 說明 |
|---|---|---|---|
| 基本型別 | byte | 1 byte | 有號補碼 |
| short | 2 bytes | 有號補碼 | |
| int | 4 bytes | 有號補碼 | |
| long | 8 bytes | 有號補碼 | |
| float | 4 bytes | IEEE 754 單精度 | |
| double | 8 bytes | IEEE 754 雙精度 | |
| char | 2 bytes | 無號 Unicode (UTF-16 碼元) | |
| boolean | — | 無獨立指令,以 int (0/1) 處理;boolean[] 以 byte[] 實作 | |
| 參考型別 | reference | 4/8 bytes | 指向物件的引用 (32/64 位元 JVM 不同),Sun 實作為句柄雙指標 |
| returnAddress | 4 bytes | jsr/ret 指令用,現代已少用 |
嚴格規定內部格式 確保跨平台一致性 (如 float/double 必須 IEEE 754)。
+-------------------------+ ← 線程共享 | Heap (堆) | 物件實例分配區,GC 主戰場,可分代 (Young/Old) +-------------------------+ | Method Area (方法區) | 類元資料、常數池、靜態變數、JIT 代碼缓存 | (Java 8+ Metaspace) | Java 8 移至 Native Memory (Metaspace),不佔 Heap +-------------------------+ ← 線程私有 | JVM Stacks (虛擬機棧) | 每方法一個 Frame:區域變數表、操作數堆疊、動態連結、返回地址 | (Stack Frames) | -Xss 設定大小,溢出拋 StackOverflowError +-------------------------+ | PC Register (程序計數器)| 當前執行字節碼指令地址,線程私有,唯一不會 OOM 區域 +-------------------------+ | Native Method Stacks | Native 方法調用棧 (JNI) +-------------------------+
iadd (int)、ladd (long)、fadd (float)、dadd (double)
ClassFile {
u4 magic = 0xCAFEBABE; // 魔數
u2 minor_version;
u2 major_version; // 版本號 (Java 8 = 52)
u2 constant_pool_count;
cp_info constant_pool[]; // 常數池:字面量、符號引用
u2 access_flags; // 存取標誌 (public, final, interface...)
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[];
u2 fields_count;
field_info fields[]; // 欄位表
u2 methods_count;
method_info methods[]; // 方法表 (含 Code 屬性: 字節碼、行號、局部變數表)
u2 attributes_count;
attribute_info attributes[]; // 屬性表 (SourceFile, Deprecated, Signature...)
}
關鍵結構:常數池 (常數池是 Class 檔「資源倉庫」)、Code 屬性 (方法字節碼核心載體)。
Bootstrap ClassLoader (啟動類載入器) ← C++ 實作,載入 rt.jar / jrt-fs.jar
↑
Extension ClassLoader (擴展類載入器) ← 載入 jre/lib/ext/*.jar
↑
Application ClassLoader (應用類載入器) ← 載入 classpath
↑
Custom ClassLoaders (使用者自定義) ← 熱部署、模組化、隔離
Class 物件<clinit> (靜態區塊、靜態變數賦值)| 晶片 | 定位 | 特點 |
|---|---|---|
| picoJava | 核心 IP 核 | 25mm²,授權廠商客製化,低端 <$25 |
| microJava | 微控制器 | 含 picoJava + 記憶體控制器 + 外設,嵌入式/通訊設備 |
| UltraJava (MAJC) | 高效能處理器 | VLIW 多執行緒,圖形/多媒體加速,後併入 Sun 伺服器晶片 |
現代趨勢:GraalVM Native Image / AOT 編譯 取代硬體 JVM,獲得原生效能同時保留 Java 生態。
| 參數 | 說明 |
|---|---|
-Xms | 堆初始大小 |
-Xmx | 堆最大大小 |
-Xss | 執行緒棧大小 |
-XX:MetaspaceSize | Metaspace 初始大小 |
-XX:MaxMetaspaceSize | Metaspace 最大大小 |
-XX:+UseG1GC | 啟用 G1 收集器 (JDK 9+ 預設) |
-XX:+UseZGC | 啟用 ZGC (低延遲,大堆) |
-verbose:gc | 印出 GC 日誌 |
-XX:+PrintCompilation | 印出 JIT 編譯資訊 |
JVM 是精密的虛擬計算機,掌握其記憶體模型、類載入機制、執行引擎原理,對效能調優、疑難雜症排查、框架原理理解、原生互操作 (JNI) 具有決定性意義。現代 JVM (HotSpot/OpenJ9/GraalVM) 持續演進,核心架構穩定,新特性聚焦於低延遲 GC、啟動速度 (AOT)、模組化隔離與雲原生適配。