JVM执行引擎的执行过程

JVM执行引擎的执行过程

1月16日厦门 OSC 源创会火热报名中,奖品多多哦 »  

以下面代码为例看一下执行引擎是如何将一段代码在执行部件上执行的,如下一段代码:

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

对应到执行引擎的各执行部件如图:

JVM执行引擎的执行过程_第1张图片

在开始执行方法之前,PC寄存器存储的指针是第1条指令的地址,局部变量区和操作栈都没有数据。从第1条到第4条指令分别将a、b两个本地变量赋值,对应到局部变量区就是1和2分别存储常数1和2,如图:

JVM执行引擎的执行过程_第2张图片

第5条和第6条指令分别是将两个局部变量入栈,然后相加,如图:

JVM执行引擎的执行过程_第3张图片

1先入栈2后入栈,栈顶元素是2,第7条指令是将栈顶的两个元素弹出后相加,结果再入栈,如图:

JVM执行引擎的执行过程_第4张图片

可以看出,变量a和b相加的结果3存在当前栈顶中,接下来第8条指令将10入栈,如图:

JVM执行引擎的执行过程_第5张图片

当前PC寄存器执行的地址是9,下一个操作是将当前栈的两个操作数弹出进行相乘并把结果压入栈中,如图:

JVM执行引擎的执行过程_第6张图片

第10条指令是将当前的栈顶元素存入局部变量3中,如图:

JVM执行引擎的执行过程_第7张图片

第10条指令执行完后栈中元素出栈,出栈的元素存储在局部变量区3中,对应的是变量c的值。最后一条指令是return,这条指令执行完后当前的这个方法对应的这些部件会被JVM回收,局部变量区的所有值将全部释放,PC寄存器会被销毁,在Java栈中与这个方法对应的栈帧将消失。

你可能感兴趣的:(Java)