一次调用的状态

Java 虚拟机规范为每次方法调用建立新帧。方法正常返回或因未捕获异常而退出时,该帧结束;调用另一个方法时,新帧成为当前帧,返回后再恢复调用方。

每个 JVM 帧具有局部变量数组、操作数栈和当前类运行时常量池的引用。这是虚拟机定义的逻辑结构,具体存储布局仍由实现决定。

参考:[1]

机器调用约定中的帧

机器代码并不一定把所有参数和临时值压入栈。Microsoft x64 默认约定利用寄存器传递前几个参数,同时要求调用方预留相应的栈空间,超过寄存器位置的参数再使用栈。

异常展开和栈回溯需要识别调用状态如何保存和恢复。该平台为相关函数保存展开信息,因此“栈帧”不能被简化成一种跨处理器、跨系统通用的字节布局。

参考:[3]

语言帧对象与调试

Python 的帧接口可以取得代码对象、当前行号、局部变量及外层帧。调试器据此理解执行位置,但这些访问接口并不要求应用直接读取解释器内部结构。

生成器和协程也可以拥有帧。调用暂停时,运行时可能仍需保存其状态;因此,逻辑执行帧的存续时间不能总用“正在机器栈上运行的函数”来解释。

参考:[2]