基於開源 Kaffe VM 核心思想,採用 C 語言、Windows 平台、即時編譯器 (JIT) 作為執行引擎,實現一款精簡 JVM。重點攻關:Class 驗證、JIT 編譯、三色標記 GC、線程同步與調度。
Java源碼(.java) → javac → 字節碼(.class)
↓
類加載器 → 方法區
↓
連接(驗證/準備/解析)
↓
初始化()
↓
JIT編譯器 → 本地機器碼
↓
執行引擎(解釋/執行機器碼)
| 階段 | 關鍵動作 |
|---|---|
| 加載 | 讀取 .class 二進制流 → 方法區生成 `Class` 物件 |
| 連接-驗證 | 文件格式、元數據、字節碼數據流分析、符號引用驗證 |
| 連接-準備 | 靜態欄位分配記憶體、設定預設值 (0/null/false) |
| 連接-解析 | 常量池符號引用 → 直接引用 (指針/偏移量) |
| 初始化 | 執行 ` |
設計權衡:
四階段編譯管線:
(目標操作數, 源操作數1, 源操作數2, 語義動作)。// 四元式結構體 (C)
typedef struct Sequence {
void (*func)(struct Sequence*); // 語義動作函數指針
union { jvalue value; struct _label_* labconst; Method* methconst; ... } u[3];
uint8 type; uint8 refered; struct Sequence* next;
} Sequence;
方法幀結構:包含操作數棧、局部變量表、程序計數器、動態鏈接、方法返回地址。
算法流程:
// 對象頭結構 (含同步鎖計數器)
typedef struct Obj {
uint32 size;
uint16 counter; // 鎖重入計數
uint16 flag; // 狀態標記 (白/灰/黑)
uint16 thread_id; // 持有鎖的線程 ID
} Obj;
| 層面 | 實現細節 |
|---|---|
| 同步原語 | 字節碼 `monitorenter`/`monitorexit` → 對象頭 `counter` 計數器實現重入鎖 |
| 等待隊列 | 對象關聯 `wait set`,`wait()` 釋放鎖進入隊列,`notify()`/`notifyAll()` 喚醒 |
| 調度策略 | 支援 FIFO、優先級搶佔;建議採用 `notifyAll()` 避免信號丟失 (Bill Venners 建議) |
| 線程模型 | 1:1 映射系統原生線程 (Windows API `CreateThread`) |
掌握 JVM 實現細節,可針對實時嵌入式系統裁剪:
JVM 核心在執行引擎與內存管理。本專案驗證了 JIT + 三色 GC + 1:1 線程模型在 Windows 上的可行性。若追求生產級效能,必須向分層編譯、分代 GC、先進同步優化演進。理解底層機制,寫出高效 Java 代碼才有理據依歸。