虚拟机字节码执行引擎之运行时栈帧结构
引言
执行引擎在执行Java代码时可能会有解释执行(解释器执行)和编译执行(JIT产生本地代码执行)。
运行时栈帧结构
栈帧存储了局部变量表、操作数栈、动态链接、方法返回地址。执行引擎运行的所有字节码指令都只针对虚拟机栈顶的栈帧而言。
局部变量表
局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数、方法内部定义的局部变量。
虚拟机通过索引定位方式使用局部变量表,索引范围在0~max_locals(属于Code属性,局部变量表的最大Slot数量),如果访问32位数据类型变量时,索引 n 代表使用第 n 个Slot,如果是64位数据类型变量(double、long),代表使用 n 和 n + 1 个Slot。
局部变量不赋初始值是不会有零值的。
操作数栈
方法开始执行的时候操作数栈是空的, 方法执行过程中各种指令往操作数栈写入和读取内容(读局部变量表写入操作数栈顶,读操作数栈顶写入局部变量表)。
动态连接
每个栈帧都有一个指向常量池中该栈帧所属方法的引用,持有该引用就是为了支持方法调用过程中的动态连接。方法的符号引用一部分在类加载阶段就转化成了直接引用称为静态解析。一部分在运行期间转化为直接引用称为动态连接。
方法返回地址
方法执行后有两种方式退出,一个是执行引擎遇到任意一个返回指令(如return、ireturn),一个是方法执行期间发生异常,该异常未在方法体中处理。正常退出时调用者的PC计数器的值可以作为方法返回地址存储在栈帧中。