1. JVM運行數據區概述
.class與字節碼bytecode
- .class: 是指文件擴展名稱爲.class的文件,表示由java源程序經過java編譯器編譯而成且由JVM執行的二進制文件,因此可以通過擁有一份.class文件在不同的操作系統平臺上的JVM執行,實現跨平臺運行的特性
- 字節碼bytecode: 簡單說不是文件,而是JVM操作的指令格式,通常我們通過
javap -c -v xx.class
生成的文件稱爲字節碼文件,是屬於可閱讀的字節碼指令文件,能夠讓我們清楚地知道java文件編譯成.class文件之後顯示的執行指令,便於程序員理解jvm的相關的知識
.class文件與字節碼文件格式
- .class文件(16進制文件)
- 字節碼文件(可閱讀的指令文件)
2. .class文件結構與字節碼
.class文件結構
-
幻數
- 類文件的四個字節表頭0xCAFEBABE
- 類文件的四個字節表頭0xCAFEBABE
-
類文件格式的版本
- 類文件的次要和主要版本
- jdk的主要版本如下
Java SE 14 = 58 (0x3A hex), Java SE 13 = 57 (0x39 hex), Java SE 12 = 56 (0x38 hex), Java SE 11 = 55 (0x37 hex), Java SE 10 = 54 (0x36 hex),[3] Java SE 9 = 53 (0x35 hex),[4] Java SE 8 = 52 (0x34 hex), Java SE 7 = 51 (0x33 hex), Java SE 6.0 = 50 (0x32 hex), Java SE 5.0 = 49 (0x31 hex),
表示0x0034當前使用jdk版本爲jdk8
-
常量池: 類文件的常量池
-
訪問標識: 類文件的訪問標識, abstract, static,等等
-
當前的類名稱,class name
-
當前父類的名稱, super class name
-
當前類的任何接口
-
當前類的字段信息
-
當前類的方法信息
-
當前類的屬性信息
字節碼指令
- 指令類別
- 存儲指令 (例如:aload_0, istore)
- 算術與邏輯指令 (例如: ladd, fcmpl)
- 類型轉換指令 (例如:i2b, d2i)
- 對象創建與操作指令 (例如:new, putfield)
- 堆棧操作指令 (例如:swap, dup2)
- 控制轉移指令 (例如:ifeq, goto)
- 方法調用與返回指令 (例如:invokespecial, areturn)
- 指令操作前後綴與數據類型
- i 整數
- l 長整數
- s 短整數
- b 字節
- c 字符
- f 單精度浮點數
- d 雙精度浮點數
- z 布爾值
- a 引用
- 例子
## iadd 表示兩個整數相加
## dadd 表示兩個double類型數據相加
....
- 參見jvm的規範
## jvm指令碼錶
https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-6.html#jvms-6.5
## jvm字節碼文件格式
https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-4.html#jvms-4.1