015、运行时栈帧

Par @Martin dans le
Tags :

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构, 它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.
栈帧存储了方法的局部变量表操作数栈动态连接和方法返回地址等信息.
每一个方法从调用开始到执行完成的过程, 就对应着一个栈帧在虚拟机里面从入栈到出栈的过程.

每一个栈帧都包括了局部变量表、操作数栈、方法返回地址和一些额外的附加信息.
在编译程序代码的时候, 栈帧中需要多大的局部变量表、多深的操作数栈都已经完全确定了, 并且写入到方法表的 Code 属性之中,
因此一个栈帧需要分配多少内存, 不会受到程序运行期变量数据的影响, 而仅仅取决于具体的虚拟机实现.

一个线程中的方法调用链可能会很长, 很多方法都同时处于执行状态.
对于执行引擎来讲, 活动线程中, 只有栈顶的栈帧是有效的, 称为当前栈帧(Current Stack Frame),
这个栈帧所关联的方法称为当前方法(Current Method).
执行引擎所运行的所有字节码指令都只针对当前栈帧进行操作, 栈帧的概念结构如下图所示: