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

JVM虛擬機結構基礎研究(一):類文件格式、數據類型與運行時數據區

     編輯:Java 程式設計入門

類文件格式

JVM執行單元是.class文件,規範定義了與硬件/OS無關的二進制格式,精確描述類/接口表示,甚至包含字節序等細節(平台相關目標文件通常固定不說明)。

JVM支持的數據類型

與Java語言規範幾乎一致:基本類型與引用類型,可存儲於變量表、作為參數傳遞、方法返回、操作對象。差異在於JVM獨有返回地址類型(returnAddress),供jsr、ret、jsr_w指令使用,值為JVM指令操作碼指針,運行時不可修改。

布爾類型在JVM中的特殊處理

  • 無專用布爾指令,源碼布爾運算編譯後作為int類型操作。
  • 直接支持布爾數組:newarray創建,訪問/修改卻用baload/bastore(字節數組指令)。JDK 1.0~1.2中布爾數組編碼為字節數組(每元素8位)。
  • JVM用1代表true,0代表false,編譯器映射為int且必須一致。

類型檢查策略

JVM期望幾乎所有類型檢查在運行前完成(通常由編譯器負責),運行時不再檢查。基本類型值無需標記/檢查類型,區分工作由指令集完成:iadd/ladd/fadd/dadd分別對應int/long/float/double加法,指令本身攜帶類型信息。

對象與引用

JVM顯式支持對象:類實例與數組動態分配。引用類型即對象引用,可視為指針,一個對象可有多引用,總通過引用操作/傳遞/測試。null無運行時類型,可轉換為任意類型,JVM不規定具體值。

運行時數據區(Data Areas)

JVM為程序運行定義數據區,按生存期分兩類:

與JVM生存期相同與線程生存期相同
堆PC寄存器
方法區JVM棧
本地方法棧
運行時常量池
  • 堆/方法區:JVM啟動創建,退出銷毀,全局共享。
  • 線程私有區:線程創建時建立,銷毀時釋放,每線程一份。

PC寄存器

每線程一個,保存當前執行指令地址(非本地方法);本地方法時值未定義。大小足以容納returnAddress或本地指針。

JVM棧

存儲幀(Frame),保存局部變量、部分結果,參與方法調用/返回。僅支持壓入/彈出幀操作,幀可在堆上分配。棧溢出拋StackOverflowError;動態擴展失敗拋OutOfMemoryError。

堆

所有線程共享,存放對象實例與數組。啟動時創建,垃圾回收器自動管理內存。

方法區

共享區域,存儲類結構(運行時常量池、字段/方法數據、字節碼、構造函數等)。邏輯上屬於堆一部分,但可不連續、不固定大小、可不實現GC。

運行時常量池

每個類/接口的constant_pool表在類加載後進入方法區的運行時常量池,包含編譯期常量及動態解析的符號引用。

本地方法棧

支持Native方法調用,C Stacks等實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved