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>>