操作数栈
操作数栈(Operand Stack
)也常被称为操作栈,它是一个后入先出(Last In First Out
, LIFO
)栈。
同局部变量表一样,操作数栈的最大深度也在编译的时候被写入到Code
属性的max_stacks
数据项中。
操作数栈的每一个元素都可以是包括long
和double
在内的任意Java
数据类型。
32为数据类型所占的栈容量为1,64为数据类型所占栈容量为2。
当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往
操作数栈中写入和提取内容,也就是出栈和入栈操作。
譬如
做算术运算的时候是通过将运算涉及的操作数压入栈顶后调用运算指令进行的。
整数加法
iadd
,要求操作数栈中最接近栈顶的两个元素已经存入了两个int
型的数值,执行iadd
时会把这两个int
值出栈并相加,然后将相加的结果重新入栈。在调用其他方法的时候是通过操作数栈来进行方法参数的传递。
在概念模型中,两个不同栈桢作为不同方法的虚拟机栈的元素,是完全互相独立的。但是在大多数虚拟机
的实现里都会进行一些优化,令两个栈桢出现一部分重叠。让下面栈桢的部分操作数栈与上面栈桢的部分
局部变量表重叠在一起,这样做不仅节约了一些空间,更重要的是在进行方法调用时就可以直接公用一部分数据,
无需进行额外的参数复制传递了。
Java
虚拟机的解释执行引擎被称为“基于栈的执行引擎”,里边的“栈”就是操作数栈(不是说虚拟机栈)。