参考资料
JVM符号引用——个人修炼

运行时栈帧结构

栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中虚拟机栈的栈元素

栈帧储存了方法的局部表量表,操作数栈,动态连接和返回地址等信息

image.png
局部变量表,操作数栈的大小在编译期就可以确定,并储存在方法表的code属性中

局部变量表

是一组变量值的存储空间,用于存放方法的参数和方法内定义的局部变量

局部变量表的容量最小单位为变量槽(Slot)除了double、long类型的数据占用2个单位以外,其他数据类型的变量值占用一个单位

用高位对齐的方式为占用2个单位空间的数据分配2个连续的Slot空间

虚拟机通过索引定位的方式使用局部变量表,如果非静态方法,局部变量表下标0的Slot是this,代表当前方法的类实例

局部变量表的Slot可以重用

操作数栈

后入先出栈,栈上每个元素是任意类型的,double,long类型占用栈容量为2,其他为1

出于优化考虑,实现上会令两个栈帧出现一部分重叠,让下面栈帧的部分操作数栈与上面栈帧的部分局部变量表
重叠,进行方法调用时可以共用一部分数据,无需进行额外的参数复制传递
image.png

动态连接

每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用时为了支持方法调用过程中的动态连接

符号引用在类加载时或者第一次使用时候转为直接引用,称为静态解析 每一次运行期间转化为直接引用的称为动态连接

方法返回地址

正常返回将PC计数器的值作为返回地址,异常退出根据异常处理器表来确定

方法调用

1.私有方法调用
2.构造方法
3.静态方法
4.方法重载
5.方法重写