学习JVM的一点简单笔记,宋红康老师jvm讲的很好,感谢。
尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)
操作数栈(operand stack)
栈可以使用数组或链表实现。
执行引擎会将操作码指令翻译为机器指令,做执行。
操作数栈——数组被创建——数组一旦创建长度是固定的——编译后确定栈的深度
locals——局部变量表的长度,stack——操作数栈的最大深度 (都是用数组结构实现的)
代码追踪
更好理解操作数栈和局部变量表
在终端或者jclass查看代码字节码指令等。
init——当前自定义类的构造器,默认提供。任何类都会有构造器(类都会有init()构造器方法)
byte、short、char、boolean 都以int类型保存到数组中。 float 保持float。 double、long 64位,占两个数组的位置。
1.pc寄存器,执行0地址指令,将15放入操作数栈。
2.istore_1: 类型为int类型,_1 表示索引 index为 1 的位置(this在 0 ),15从操作数栈出栈,15放入局部变量表 ,
3.istore_2操作:把8放入局部变量表index=2 的位置。
4.iload_1、iload_2 :从局部变量表,将索引为1、2的数据依次取出,放入操作数栈(入栈)
5. iadd:8和15出栈,加运算,通过执行引擎,将这里的iadd字节码指令翻译为机器指令,然后被cpu运算,然后结果放回操作数栈。
6.存储到局部变量表index=3位置。
return 结束操作。
局部变量表长度为4(this别忘了)、操作数栈深度为2
存在一个小的类型转换,如果byte可以存放下,就会是byte类型入栈,否则就会扩大为short、直至int、如果int不行就会编译错误。
存入局部变量表时,已经变成int类型了。
一上来就获取上一个栈帧返回的结果,并保存在操作数栈中。
aload_0
问题
通过字节码角度(操作数栈,局部变量表解释清楚)(后续再解释234类)