JVM Java虚拟机栈(栈帧:操作数栈)

一:特点:

  1. 操作数栈,主要用于保存计算过程中的中间结果,同时作为计算过程中变量临时的存储空间。
  2. 操作数栈就是JVM执行引擎的一个工作区,当一个方法刚开始执行的时候,一个新的栈帧也会随之被创建,这个方法的操作数栈是空的。
  3. 每一个操作数栈都会拥有一个明确的栈深度用于存储数值。
  4. 如果被调用的方法带有返回值的话,其返回值将会被压入当前栈帧的操作数栈中。
  5. 我们说是java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是操作数栈。
  6. 如果被调用的方法带有返回值的话,其返回值将会被压入当前栈帧的操作数栈中

二.执行过程:

在这里插入图片描述
反编译后字节码文件如下:
在这里插入图片描述

1.第一步:
  • bipush: 将值压入操作数栈的操作
  • istore_1:将操作数栈中栈顶指针指向的值放入局部变量表中索引为1的地方。(后面的数字一次类推)
  • iload_1:将局部变量表中索引为1的值压入操作数栈中。
  • iadd:让操作数栈中的数字纷纷出栈,通过执行引擎进行add操作。

PC寄存器中存储第0的指令地址,然后对应指令地址执行对应的操作指令bipush。将15压入操作数栈,此时栈顶指针指向15。
PC寄存中存入2的地址指令,15出栈,进入局部变量表中索引为1的位置(istore_1)(索引为0的位置存放的this)
在这里插入图片描述

2.第二步:

8压入操作数栈(bipush),然后出栈进入局部变量表索引为2的位置(istore_2)
在这里插入图片描述

3.第三步:

iload_1 和 iload_2 分别将局部变量表中的15和8放入操作数栈中。
在这里插入图片描述

4.第四步:

将操作数栈中的15和8分别出栈,进行iadd操作,相加后的值再次压入到操作数栈中。然后执行istore_3.。将23出栈,放入局部变量表索引为3的地方。
在这里插入图片描述

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值