zoukankan      html  css  js  c++  java
  • JAVA虚拟机20基于栈的解释器执行过程示例

    1.准备代码

    public int calc() {
      int a = 100;
      int b = 200;
      int c = 300;
      return (a + b) * c;
    }

    2.使用javap -verbose查看class文件

       该方法主要的指令内容如下

    public int calc();
    Code:
    Stack=2, Locals=4, Args_size=1
    0: bipush 100
    2: istore_1
    3: sipush 200
    6: istore_2
    7: sipush 300
    10: istore_3
    11: iload_1
    12: iload_2
    13: iadd
    14: iload_3
    15: imul
    16: ireturn
    }
      javap提示这段代码需要深度为2的操作数栈和4个变量槽的局部变量空间
     
    3.执行过程
    3.1偏移量为0的指令
      首先,执行偏移地址为0的指令,Bipush指令的作用是将单字节的整型常量值(-128~127)推入操作数栈顶,跟随有一个参数,指明推送的常量值,这里是100。
     
    3.2偏移量为2的指令
      istore_1指令的作用是将操作数栈顶的整型值出栈并存放到第1个局部变量槽中。
      后续几条条指令(直到偏移为11的指令为止)都是做一样的事情,也就是在对应代码中把变量a、b、c赋值为100、200、300。
     
    3.3偏移量11的指令

      iload_1指令的作用是将局部变量表第1个变量槽中的整型值复制到操作数栈顶。

     
    3.4偏移量为12
      iload_2指令的执行过程与iload_1类似,把第2个变量槽的整型值入栈。
     
    3.5偏移量为13

      iadd指令的作用是将操作数栈中头两个栈顶元素出栈,做整型加法,然后把结果重新入栈。在iadd指令执行完毕后,栈中原有的100和200被出栈,它们的和300被重新入栈。

    3.6偏移量为14的指令

      iload_3指令把存放在第3个局部变量槽中的300入栈到操作数栈中。这时操作数栈为两个整数300。

    3.8偏移量15的指令

      imul是将操作数栈中头两个栈顶元素出栈,做整型乘法,然后把结果重新入栈,与iadd完全类似。

    3.7偏移量16的指令

      ireturn指令是方法返回指令之一,它将结束方法执行并将操作数栈顶的整型值返回给该方法的调用者。
      到此为止,这段方法执行结束。

    参考<<深入理解java虚拟机3>>

  • 相关阅读:
    linux
    ansible
    语法糖
    jupyter login
    hadoop patch
    ganglia
    unixbench安装使用
    linux使用FIO测试磁盘的iops
    cpu事实负载使用top命令
    phoronix-test-suite测试云服务器
  • 原文地址:https://www.cnblogs.com/jthr/p/15767659.html
Copyright © 2011-2022 走看看