本文主要是介绍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计算,减少了读写次数,这样就加快了执行引擎的执行效率
这篇关于JVM06_栈帧之操作数栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!