當前位置:
首頁 >
2. 字节码指令
發布時間:2024/9/27
28
豆豆
2. 字節碼指令
2.1 入門
public cn.itcast.jvm.t5.HelloWorld();構造方法的字節碼指令
? 2a b7 00 01 b1
另一個是public static void main(java.lang.String[]);主方法的字節碼指令
? b2 00 02 12 03 b6 00 04 b1
2.2javap工具
Oracle提供了javap工具來反編譯class文件
2.3圖解方法執行流程
(1)原始Java代碼
package cn.itcast.jvm.t3.bytecode; /** *演示 字節碼指令 和 操作數棧、常量池的關系 */ public class Demo3_1{public static void main(String[] args){int a=10;int b=Short.MAX_VALUE+1;int c=a+b;System.out.println(c);} }(2)編譯后的字節碼文件
(3)常量池載入運行時常量池
(4)方法字節碼載入方法區
(5)main線程開始運行,分配棧幀內存
(stack=2,locals=4)
(6)執行引擎開始執行字節碼
bipush 10
- 將一個byte壓入操作數棧(其長度會補齊4個字節),類似的指令還有
- sipush將一個short壓入操作數棧(其長度會補齊4個字節)
- ldc將一個int壓入操作數棧
- ldc2_w將一個long壓入操作數棧(分兩次壓入,因為long是8個字節)
- 這里小的數字都是和字節碼指令存在一起,超過short范圍的數字存入了常量池
istore_1
- 將操作數棧頂數據彈出,存入局部變量表的slot 1
ldc #3
- 從常量池加載#3數據到操作數棧
- 注意Short.MAX_VALUE是32767,所有32768=Short.MAX_VALUE+1實際是在編譯期間計算好的
istore_2
iload_1
iload_2
iadd
istore_3
getstatic #4
iload_3
invokevirtual #5
- 找到常量池#5項
- 定位找到方法區Java/io/PrintStream.println:(I)V方法
- 生成新的棧幀(分配locals、stack等)
- 傳遞參數,執行新棧幀中的字節碼
- 執行完畢,彈出棧幀
- 清除main操作數棧內容
return
- 完成main方法調用,彈出main棧幀
- 程序結束
總結
- 上一篇: bootstrap table 列拖动变
- 下一篇: 学习笔记之数据可视化(二)—— 页面布局