Java虚拟机——运行时栈帧结构
2020-10-05 本文已影响0人
雁阵惊寒_zhn
运行时栈帧结构
Java虚拟机以方法作为最基本的执行单元,栈帧(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行的数据结构,也是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。
栈帧存储了方法的局部变量表、操作数栈和栈帧信息(动态连接和方法返回地址等信息)。
每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。
局部变量表
- 一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量。
- 变量槽为最小的存储单位。变量槽是可以重用的。
- 当一个方法被调用时,Java虚拟机会使用局部变量表来完成参数值到参数变量列表的传递过程,即实参到形参的传递。
- 如果是实例方法,第0位变量槽默认用于传递方法所属的对象实例的引用。
操作数栈
- 也被称为操作栈,后入先出。
- 初始时为空,方法执行时会有各种的字节码指令往操作数栈中写入和读取数据,对应着出栈和入栈操作。
- Java虚拟机面向栈结构的,里面的栈就是操作数栈。
栈帧信息
动态连接
每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用。在方法调用过程中有了这个引用可以支持动态连接。
动态连接是在运行期间将静态引用转化为直接引用。
方法返回地址
方法退出实际上对应着栈帧的出栈。当方法正常退出时,主调方法的PC计数器的值作为返回地址很可能会被保存在栈帧中;如果异常退出,返回地址通过异常处理表来确定,栈帧一般不保存这部分信息。
当方法退出后,根据虚拟机不同,实现也可能有差别,大体上经历以下三个步骤:
- 恢复上层方法的局部变量表和操作数栈;
- 如果有返回值,将其入栈到调用者的操作数栈中;
- 调整PC计数器指向方法调用后的下一条指令。
附加信息
虚拟机规范允许虚拟机实现在栈帧中增加一些规范中没有描述的信息。