0
点赞
收藏
分享

微信扫一扫

详解 JVM 字节码(8)


字节码的执行方式,
程序执行有两种是编译执行和解释执行,JIT 编译产生本地代码生成机器码来执行。现在的 JVM 解释执行和编译执行结合来运行程序。

  • 解释执行,将通过解释器读取字节码遇到相应的指令就该执行该指令
  • 编译执行,通过JIT编译器将字节码转换为本地机器码来执行;现代 JVM 会根据代码热点来生成机器码。
stack=2, locals=5, args_size=1
         0: iconst_0
         1: istore_1
         2: iconst_1
         3: istore_2
         4: iconst_2
         5: istore_3
         6: iconst_3
         7: istore        4
         9: iload_2
        10: iload_3
        11: iadd
        12: iload         4
        14: imul
        15: iload_2
        16: isub
        17: istore_1
        18: iload_1
        19: ireturn

  • iconst_0 将 result 0 推送到操作数栈顶
  • istore_1 将 1 必须是当前栈帧的局部变量的索引,并且栈顶的类型必须为 int 然后将栈顶弹出赋值给局部变量第 1 的变量设置为弹出的值。0 位置局部变量位置为 this。
    下面到 6 以此类推
    iconst_1 是将 1 入栈 -> 然后 istore_2 是从栈弹出栈顶的1(也就是刚刚入栈的 1)放置到局部变量表(类似数组)的第 2 个位置。

  • iload_2 :将索引为 2 的局部变量放置到栈顶,栈顶为 1
  • iload_3 :将索引为 3 的局部变量放置到栈顶,栈顶为 2
  • iadd :完成 int 加法,不接收参数,参数是从操作数栈顶依次弹出进行完加法重新放置到
    栈顶
  • iload 4 将索引为 4 的局部变量放置到栈顶
  • imul :进行 int 的乘法
    ...
  • istore_1 将结构保存到索引为 1 的局部变量也就是(result)
举报

相关推荐

0 条评论