Using GoLang to implement a simple JVM
這是一切的開始,起初只是好奇心,想做一個能跑 System.out.println() 的 JVM。到後面停不下來探索知識的慾望。
MVP 時期的筆記有些雜亂,移到 MVP Plan Documents 做紀念。
| 大版本 | 主題 | 子版本數 | 目標 |
|---|---|---|---|
| v0.1.x | ClassFile 解析 | 1 | 了解 .class 結構基礎 |
| v0.2.x | 核心執行引擎 | 11 | 單執行緒 Java 程式完整執行 |
| v0.3.x | 物件模型完善 | 4 | GC/多執行緒 共同前置 |
| v0.4.x | 多執行緒 | 6 | 併發程式支援 + Safe Point |
| v0.5.x | GC 專題 | 7 | 深入研究各種 GC 演算法 |
v0.2 目標是讓 GOGO_JVM 能執行大部分 Single-Thread 的 Java 程式。
- v0.2.1: Basic Instructions
- v0.2.2: Simple Runtime Thread
- v0.2.3: Basic Method Area Implementation
- v0.2.4: Define Object Structure And
newInstruction - v0.2.5: Invoke Object Method
invokespecialAndinvokevirtual - v0.2.6: Support Basic Type Array
- v0.2.7: Native Method And
System.out.println - v0.2.8: Class Enhancement -
instanceof/checkcast/anewarray - v0.2.9: Support
java.lang.String - v0.2.10: Support
try-catch-finally - v0.2.11: Support interface
v0.3 目標是能支援 Class 物件與基本反射,標準物件頭 (Mark Word), Reference 類型支援,完整的物件生命週期。後續可以實現多執行緒和 GC。
- v0.3.0: Revamp - Object Header
- v0.3.1: Basic Reflection
- v0.3.2: Support Reference Type
java.lang.ref - v0.3.3: Object Lifecycle (Object from creation to Destroy)
v0.4 目標是實現 java.lang.Thread 類與基本執行緒管理。
- 🚧 v0.4.0: Thread Basic
- 🚧 v0.4.1: Support
synchronized - 🚧 v0.4.2: Support
wait/notify - 🚧 v0.4.3: Support
interrupt - 🚧 v0.4.4: Support
volatileAnd Memory Model - 🚧 v0.4.5: Safe Point (Pre-Work for GC)
v0.5 深入研究實現各種 GC 演算法
- 🚧 v0.5.0: Heap Structure
- 🚧 v0.5.1: Mark-Sweep GC
- 🚧 v0.5.2: Mark-Compact GC
- 🚧 v0.5.3: Copying GC
- 🚧 v0.5.4: GC (Generational)
- 🚧 v0.5.5: Concurrent GC Basic
- 🚧 v0.5.6: GC Advance (G1 / ZGC)
類加載器完善
目前:單一 ClassLoader 目標:完整的類加載器層次結構
目標:
├── 雙親委派模型
├── 類的隔離與共享
├── 動態類加載
├── 模組系統(Java 9+ Module)
└── OSGi 概念
實現內容:
- Bootstrap ClassLoader
- Extension ClassLoader
- Application ClassLoader
- 自定義 ClassLoader
- Class Unloading(配合 GC)
JIT 編譯器
目前:解釋執行(慢) 目標:熱點代碼編譯成機器碼(快) - 理解現代 VM
目標:
├── 編譯器後端設計
├── 寄存器分配
├── 指令選擇
├── 內聯優化(Inlining)
├── 逃逸分析(Escape Analysis)
└── On-Stack Replacement (OSR)
實現路徑:
- 熱點偵測(計數器)
- 基本 IR(中間表示)設計
- 簡單的機器碼生成(x86-64)
- 方法內聯
- 逃逸分析 + 標量替換
調試與監控工具
目標:實現 JVMTI / JMX 類似功能
目標:
├── 斷點機制
├── 單步執行
├── 變數查看
├── 性能分析(Profiling)
└── 記憶體分析(Heap Dump)
實現內容:
- 調試協議(類似 JDWP)
- 斷點表管理
- Stack Trace 生成
- Heap Histogram
- GC 日誌與分析