首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

JVM 虛擬機架構基石:類文件格式、數據類型、運行時數據區深度解析

     編輯:Java 程式設計入門

引言:為什麼要研究 JVM 規範?

從 String vs StringBuffer 效能爭論出發,發現反編譯對比不可靠,必須深入字節碼指令與運行時結構才能得出令人信服的結論。本系列記錄 JVM 規範學習心得。

類文件格式

  • 平台無關的二進制格式,精確定義類/介面表示
  • 包含字節序等底層細節(平台相關格式通常隱含不說明)
  • 結構:魔數、版本、常量池、訪問標志、索引、字段表、方法表、屬性表

JVM 數據類型 vs Java 語言類型

浮點數與 IEEE 754

JVM 浮點運算嚴格遵循 IEEE 754,支援非正規數、無窮大、NaN。strictfp 關鍵字強制嚴格模式(早期 JVM 允許擴展精度中間結果)。

類型檢查策略

  • 靜態為主:編譯期完成幾乎所有類型檢查
  • 指令區分類型:iadd/ladd/fadd/dadd、iaload/caload 等指令編碼了操作數類型
  • 運行時不攜帶類型標籤,基本類型值無標記,引用類型由指令語義區分

對象與引用

  • 對象 = 類實例或數組,動態分配於堆
  • 引用類型值 = 對象指針,多引用可指向同一對象
  • null:無運行時類型,可轉換為任意引用類型,JVM 不規定具體位模式

運行時數據區

JVM 為每個程序定義數據區,按生命週期分兩類:

分類Java 語言JVM差異說明
基本類型boolean, byte, short, int, long, float, double, char同左,無 boolean 指令boolean 編譯為 int 操作;數組用 byte 存儲 (baload/bastore)
引用類型類、介面、數組同左引用值可視為指針
特有類型無returnAddressjsr/ret/jsr_w 指令用,指向字節碼偏移量,不可被程序修改

關鍵細節

  • PC 寄存器:足夠容納 returnAddress 或本機指針,極小
  • JVM 棧:幀可在堆分配,支援動態擴展。溢出拋 StackOverflowError,擴展失敗拋 OutOfMemoryError
  • 方法區:JDK 8+ 移至元空間,使用本機內存,受 -XX:MaxMetaspaceSize 控制
  • 運行時常量池:String.intern() 可動態擴展,溢出拋 OutOfMemoryError

下一章預告

深入棧幀結構、方法調用與返回、字節碼指令集分類、類加載機制(雙親委派、熱替換基礎)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
數據區生命週期線程私有?核心職責
PC 寄存器線程是當前執行指令地址(native 方法時未定義)
JVM 棧線程是棧幀:局部變量表、操作數棧、動態連接、方法返回地址
本地方法棧線程是支援 native 方法調用
堆JVM否所有對象實例、數組分配區,GC 主戰場
方法區JVM否類元數據、常量、靜態變量、JIT 編譯代碼
運行時常量池JVM否每類一份,含字面量、符號引用,動態性(String.intern)