KVM (Kilobyte Virtual Machine) 是 Java 2 Platform, Micro Edition (J2ME) 平台中 CLDC (Connected Limited Device Configuration) 參考實現的核心虛擬機。名稱中的「Kilo」意指其設計目標:在擁有 **幾百 KB 內存** 與 **低性能 CPU** 的設備上運行(早期目標:總內存 < 128 KB,堆 < 64 KB)。
| 特性 | JVM (J2SE) | KVM (J2ME/CLDC) |
|---|---|---|
| 目標設備 | 桌面/服務器 (PC、工作站) | 移動電話、尋呼機、PDA、嵌入式設備 |
| 內存需求 | 數 MB ~ 數 GB | ~100-200 KB 核心 + 應用堆 |
| CPU 需求 | x86/ARM 高性能,通常有 FPU | 16/32 位低功耗 CPU,常無 FPU |
| 類加載器 | 完整層級委派模型 | 極簡單加載器,無用戶自定義類加載器 |
| 垃圾回收 | 分代、並發、G1、ZGC 等 | 簡單標記-清掃/複製,可配置觸發閾值 |
| 線程模型 | 原生 OS 線程 1:1 | 綠色線程 / 用戶級線程 (VM 內部調度) |
| 浮點支持 | 完整 float/double | CLDC 1.0 無 float/double,CLDC 1.1 可選 |
| 反射/ JNI | 完整支持 | 無反射,無 JNI (用 KNI 替代) |
| 驗證器 | 完整字節碼驗證 | 預驗證 + 輕量運行時驗證 (預驗證工具預處理 class 文件) |
J2ME Platform
├── Configurations (配置)
│ ├── CLDC 1.0/1.1 ← 核心庫 + KVM
│ │ ├── java.lang, java.io, java.util (子集)
│ │ ├── javax.microedition.io (GCF 連接框架)
│ │ └── **KVM** (虛擬機核心)
│ └── CDC (更強設備,用 CVM/完整 JVM)
└── Profiles (配置文件)
├── MIDP 1.0/2.0/3.0 (手機應用)
│ ├── javax.microedition.lcdui (UI)
│ ├── javax.microedition.rms (持久化)
│ └── javax.microedition.midlet (生命周期)
├── IMP (資訊模組)
└── 其他垂直領域 Profile
KVM 只是 CLDC 的**一種參考實現**。商用手機通常採用廠商深度優化的 VM(如 Nokia 的 NSVT、Sony Ericsson 的 JP-8、Motorola 的 iJET),但它們都遵循 CLDC 規範,行為與 KVM 一致。
Sun 早年將 KVM 核心作為開源項目發布(Community Source License),現已歸檔。歷史下載鏈接:
https://www.sun.com/software/communitysource/J2ME/cldc/download.xml
源碼包含:C 語言實現的解釋器、GC、類加載器、KNI (KVM Native Interface) 等,適合研究嵌入式 JVM 實現原理。
float/double,改用定點數 (Q16.16 或 Q8.24)。preverify 工具,否則真機拒絕加載 class。callSerially() 替代 wait/notify。