操作数栈
栈可以用数组,也可以用链表来实现(操作数栈先进后出,数组按照顺序存放,有索引)
只能有push还有pop 这俩操作 
字节码指令会由执行引擎会把字节码指令信息翻译成机器指令(iadd求和运算)

bipush 15还有 bipush 8 都存在操作数栈当中, 再从局部变量表中取出进行求和运算,运算完再把它放到局部变量表中 istore_3

数组一旦创建,长度固定,在编译器就确定了明确的深度

java p反编译后 stack=2 就是操作数栈的深度,locals=3就是局部变量表的深度



push操作就是把15放到操作数栈当中 创建之初 操作数栈空.局部变量表为空,pc寄存器指向0(下一个操作的指令地址是0)
-> 
把栈顶的15取出来放到局部变量表中, istore_1 意思是放到索引为1的位置 (为啥不是1) 因为非静态的方法,他的0的位置是this,所以下面的i放到1的位置

pc寄存器依次调整,是运行速度最快的区域 下面这一步,又是把局部变量表中索引为1和2的数据呢,压栈(放了两个数据) 紧接着出栈,iadd运算
执行引擎把字节码指令翻译成机器指令让cpu进行运算

下一步又压栈存结果23到操作数栈,然后又出栈到局部变量表,存到索引为3的地方存放,最后return结束 而局部变量表索引为3长度就是4,(0是this)
对应上了操作数栈2,局部变量表4

总结 :
局部变量表:方法的形参,方法内部定义的变量.用数组来实现,在编译器就确定了数组的长度
栈顶缓存:

内存读写次数太多, 栈顶的元素缓存到物理cpu的寄存器中.

浙公网安备 33010602011771号