Java虚拟机——运行时栈帧结构

2020-10-05  本文已影响0人  雁阵惊寒_zhn

运行时栈帧结构

Java虚拟机以方法作为最基本的执行单元,栈帧(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行的数据结构,也是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。
栈帧存储了方法的局部变量表、操作数栈和栈帧信息(动态连接和方法返回地址等信息)。
每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。

局部变量表

操作数栈

栈帧信息

动态连接

每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用。在方法调用过程中有了这个引用可以支持动态连接。
动态连接是在运行期间将静态引用转化为直接引用。

方法返回地址

方法退出实际上对应着栈帧的出栈。当方法正常退出时,主调方法的PC计数器的值作为返回地址很可能会被保存在栈帧中;如果异常退出,返回地址通过异常处理表来确定,栈帧一般不保存这部分信息。
当方法退出后,根据虚拟机不同,实现也可能有差别,大体上经历以下三个步骤:

  1. 恢复上层方法的局部变量表和操作数栈;
  2. 如果有返回值,将其入栈到调用者的操作数栈中;
  3. 调整PC计数器指向方法调用后的下一条指令。

附加信息

虚拟机规范允许虚拟机实现在栈帧中增加一些规范中没有描述的信息。

上一篇下一篇

猜你喜欢

热点阅读