日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

2. 字节码指令

發布時間:2024/9/27 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2. 字节码指令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2. 字節碼指令

2.1 入門

public cn.itcast.jvm.t5.HelloWorld();構造方法的字節碼指令

? 2a b7 00 01 b1

  • 2a=> aload_0加載slot 0的局部變量,即this,做為下面的invokespecial 構造方法調用的參數
  • b7 =>invokespecial預備調用構造方法,哪個方法呢?
  • 00 01引用常量池中#1項,即【Method Java/lang/Object.""😦)V】
  • b1表示返回(return)
  • 另一個是public static void main(java.lang.String[]);主方法的字節碼指令

    ? b2 00 02 12 03 b6 00 04 b1

  • b2=>getstatic 用來加載靜態變量,哪個靜態變量呢?(System.out)
  • 00 02引用常量池中#2項,即【Fied java/lang/System.out:Ljava/io/PrintStream;】
  • 12=>ldc 加載參數,哪個參數呢?(hello world常量)
  • 03引用常量池中#3項,即【String hello world】
  • b6=>invokirtual 預備調用成員方法,哪個方法呢?(println(String)V
  • 00 04引用常量池中#4項,即【Method java/io/PrintStream.println:(Ljava/lang/String;)V】
  • 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棧幀
    • 程序結束

    總結

    以上是生活随笔為你收集整理的2. 字节码指令的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。