操作数栈


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

代码追踪

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计算,减少了读写次数,这样就加快了执行引擎的执行效率
本文详细解析了操作数栈与局部变量表的工作原理,包括它们如何使用数组实现栈结构,以及如何通过字节码指令进行数据的存储与操作。通过具体的代码示例,展示了操作数栈在JVM执行过程中的作用。
1484

被折叠的 条评论
为什么被折叠?



