以下面代码为例看一下执行引擎是如何将一段代码在执行部件上执行的,如下一段代码:
public class Math{
public static void main(String[] args){
int a = 1 ;
int b = 2;
int c = (a+b)*10;
}
}
其中main的字节码指令如下:
偏移量 指令 说明
0: iconst_1 常数1入栈
1: istore_1 将栈顶元素移入本地变量1存储
2: iconst_2 常数2入栈
3: istore_2 将栈顶元素移入本地变量2存储
4: iload_1 本地变量1入栈
5: iload_2 本地变量2入栈
6: iadd 弹出栈顶两个元素相加
7: bipush 10 将10入栈
9: imul 栈顶两个元素相乘
10: istore_3 栈顶元素移入本地变量3存储
11: return 返回
对应到执行引擎的各执行部件如图:
在开始执行方法之前,PC寄存器存储的指针是第1条指令的地址,局部变量区和操作栈都没有数据。从第1条到第4条指令分别将a、b两个本地变量赋值,对应到局部变量区就是1和2分别存储常数1和2,如图:
第5条和第6条指令分别是将两个局部变量入栈,然后相加,如图:
1先入栈2后入栈,栈顶元素是2,第7条指令是将栈顶的两个元素弹出后相加,结果再入栈,如图:
可以看出,变量a和b相加的结果3存在当前栈顶中,接下来第8条指令将10入栈,如图:
当前PC寄存器执行的地址是9,下一个操作是将当前栈的两个操作数弹出进行相乘并把结果压入栈中,如图:
第10条指令是将当前的栈顶元素存入局部变量3中,如图:
第10条指令执行完后栈中元素出栈,出栈的元素存储在局部变量区3中,对应的是变量c的值。最后一条指令是return,这条指令执行完后当前的这个方法对应的这些部件会被JVM回收,局部变量区的所有值将全部释放,PC寄存器会被销毁,在Java栈中与这个方法对应的栈帧将消失。