# Operrand Stack
操作数栈的功能参考下面的流程解释
package com.mrzhang.javalearn.jvm.zz;
/**
* 操作数栈(一)
*
* @author 91MrZhang on 2020/8/12
*/
public class TestDemo3 {
public static void main(String[] args) {
int a = 10;
int b = 20;
int d = 30;
int c = a + (b * d) ;
}
}
- bipush 10 : 将10压入操作数栈
- istore_1 : 将操作数栈中的第一个数赋值给1号变量
- bipush 20 : 将20压入操作数栈
- istore_2 : 将操作数栈中的第一个数赋值给2号变量
- bipush 30 : 将30压入操作数栈
- istore_3 : 将操作数栈中的第一个数赋值给3号变量
- iload_1 :将1号变量压入操作数栈
- iload_2 :将2号变量压入操作数栈
- iload_3 :将3号变量压入操作数栈
- 此时操作数栈中有三个值,即10、20、30
- imul :最后入栈的和倒数第二个入栈的相乘,得到的值回栈
- iadd :回栈的值和第一个进栈的值相加
- istore_4 : 将操作数栈中的第一个数赋值给4号变量
所以可以理解为,这次操作的栈深度为3,反编译一下
javap -v TestDemo3.class
···
stack=3, locals=5, args_size=1
···
确实如此
# 栈深度占位
和slot相似,32bit类型的内容占1个栈空间,64bit的占2个栈空间
# 栈顶缓存技术 Top-of-StackCashing
前面提到,基于寄存器的JVM效果更快更好,
目前Hotspot虚拟机也将操作数栈的快速变换内容转移到了寄存中,直接在寄存器计算