操作数栈

栈可以用数组,也可以用链表来实现(操作数栈先进后出,数组按照顺序存放,有索引)

只能有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的寄存器中.

posted @ 2021-10-18 15:21  lamda表达式先驱  阅读(159)  评论(0)    收藏  举报