JVM執行單元是.class文件,規範定義了與硬件/OS無關的二進制格式,精確描述類/接口表示,甚至包含字節序等細節(平台相關目標文件通常固定不說明)。
與Java語言規範幾乎一致:基本類型與引用類型,可存儲於變量表、作為參數傳遞、方法返回、操作對象。差異在於JVM獨有返回地址類型(returnAddress),供jsr、ret、jsr_w指令使用,值為JVM指令操作碼指針,運行時不可修改。
int類型操作。newarray創建,訪問/修改卻用baload/bastore(字節數組指令)。JDK 1.0~1.2中布爾數組編碼為字節數組(每元素8位)。1代表true,0代表false,編譯器映射為int且必須一致。JVM期望幾乎所有類型檢查在運行前完成(通常由編譯器負責),運行時不再檢查。基本類型值無需標記/檢查類型,區分工作由指令集完成:iadd/ladd/fadd/dadd分別對應int/long/float/double加法,指令本身攜帶類型信息。
JVM顯式支持對象:類實例與數組動態分配。引用類型即對象引用,可視為指針,一個對象可有多引用,總通過引用操作/傳遞/測試。null無運行時類型,可轉換為任意類型,JVM不規定具體值。
JVM為程序運行定義數據區,按生存期分兩類:
| 與JVM生存期相同 | 與線程生存期相同 |
|---|---|
| 堆 | PC寄存器 |
| 方法區 | JVM棧 |
| 本地方法棧 | |
| 運行時常量池 |
每線程一個,保存當前執行指令地址(非本地方法);本地方法時值未定義。大小足以容納returnAddress或本地指針。
存儲幀(Frame),保存局部變量、部分結果,參與方法調用/返回。僅支持壓入/彈出幀操作,幀可在堆上分配。棧溢出拋StackOverflowError;動態擴展失敗拋OutOfMemoryError。
所有線程共享,存放對象實例與數組。啟動時創建,垃圾回收器自動管理內存。
共享區域,存儲類結構(運行時常量池、字段/方法數據、字節碼、構造函數等)。邏輯上屬於堆一部分,但可不連續、不固定大小、可不實現GC。
每個類/接口的constant_pool表在類加載後進入方法區的運行時常量池,包含編譯期常量及動態解析的符號引用。
支持Native方法調用,C Stacks等實現。