JVM06_栈帧之操作数栈

操作数栈

在这里插入图片描述
在这里插入图片描述
操作数栈和局部变量表都是用的数组结构,数组一旦创建,那么长度就固定了。
但是操作数栈不会采用访问索引方式进行数据访问
在这里插入图片描述

代码追踪

在这里插入图片描述
bipush:byte、short、char、boolean都是以int型来保存,bi代表int型
在这里插入图片描述
局部变量表和操作数栈都是基于数组的栈实现的
第一步:
bipush是把byte类型转换成int进行保存
PC寄存器中就是保存的指令地址,
bipush把15压入操作数栈,int占两个字节,所以下一个指令从2开始
istore_1:表示把int类型的值从操作数栈取出,存储到局部变量表中索引为1的位置(0位置是this)
在这里插入图片描述
第二:
8压入操作数栈,接着istore_2从操作数栈取出8放入局部变量表索引2的位置
在这里插入图片描述
第三:
iload_1,iload_2表示将局部变量表中1位置和2位置两个值取出,压入操作数栈,
iadd是一个字节码指令,经过执行引擎转换为机器指令,由CPU进行运算,对15和8相加。
在这里插入图片描述
第四:
将相加结果23压入到操作数栈。
然后istore_3,将操作数栈中的23放入局部变量表的3位置。
最后return
在这里插入图片描述
所以最终操作数栈长度2,局部变量表4
在这里插入图片描述
如果上一个栈帧有返回值,那么会先获取上一个栈帧的返回结果,并保存到操作数栈中
在这里插入图片描述

面试题

i++和++i的区别?
第一类问题,i++和++i一样,都是先把10放到操作数栈,然后取出存到局部变量表,最后加
在这里插入图片描述
操作数栈是数组实现的,那么长度在编译时就已经确定,既然是栈,那么只有入栈出栈,不能通过索引调用

通俗理解操作数栈:就是用来操作数的,实现结构是栈,原理是数组

栈顶缓存技术

在这里插入图片描述
hotspot JVM 采用的是基于栈式的虚拟机,那么就是指令多,需要很多的入栈出栈,读写次数就很多
栈顶缓存技术是把栈顶元素全部缓存到物理CPU寄存器中,因为寄存器中指令有指令少,速度快的优点,并且指令放到寄存器中,
可以直接在CPU计算,减少了读写次数,这样就加快了执行引擎的执行效率

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值