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

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

在开始执行方法之前,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栈中与这个方法对应的栈帧将消失。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值