從 String vs StringBuffer 效能爭論出發,發現反編譯對比不可靠,必須深入字節碼指令與運行時結構才能得出令人信服的結論。本系列記錄 JVM 規範學習心得。
| 分類 | Java 語言 | JVM | 差異說明 |
|---|---|---|---|
| 基本類型 | boolean, byte, short, int, long, float, double, char | 同左,無 boolean 指令 | boolean 編譯為 int 操作;數組用 byte 存儲 (baload/bastore) |
| 引用類型 | 類、介面、數組 | 同左 | 引用值可視為指針 |
| 特有類型 | 無 | returnAddress | jsr/ret/jsr_w 指令用,指向字節碼偏移量,不可被程序修改 |
| 數據區 | 生命週期 | 線程私有? | 核心職責 |
|---|---|---|---|
| PC 寄存器 | 線程 | 是 | 當前執行指令地址(native 方法時未定義) |
| JVM 棧 | 線程 | 是 | 棧幀:局部變量表、操作數棧、動態連接、方法返回地址 |
| 本地方法棧 | 線程 | 是 | 支援 native 方法調用 |
| 堆 | JVM | 否 | 所有對象實例、數組分配區,GC 主戰場 |
| 方法區 | JVM | 否 | 類元數據、常量、靜態變量、JIT 編譯代碼 |
| 運行時常量池 | JVM | 否 | 每類一份,含字面量、符號引用,動態性(String.intern) |