“栈帧”的五脏六腑你都知道吗

栈帧结构

一个栈帧

局部变量表帧数据区操作数栈组成。

局部变量表

局部变量表保存函数的参数以及局部变量。局部变量表中的变量只在当前函数调用中有效,当函数调用结束后,随着函数栈帧的销毁,局部变量表也随之销毁。

使用jclasslib查看局部变量表

  • 运行包含两个递归函数的测试程序
“栈帧”的五脏六腑你都知道吗

  • 有参数的递归函数局部变量表最大大小为28个字,long型变量需要占2个字。注意:字(Word)指的是计算机内存中占据一个单独的内存单元编号的一组二进制串,32位计算机上一个字为4个字节长度。
  • 无参的递归函数局部变量表大小为0字
“栈帧”的五脏六腑你都知道吗

操作数栈

操作数栈保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。

帧数据区

除了局部变量表和操作数栈外,Java栈帧还需要一些数据来支持常量池解析、正常方法返回、异常处理等。大部分字节码指令都需要进行常量池访问,在帧数据区保存访问常量池的指针,方便程序访问常量池。当函数返回或者出现异常,虚拟机必须恢复调用函数的栈帧,并让调用函数继续进行下去。对于异常处理,虚拟机必须有一个异常处理表,方便在发生异常的时候找到处理异常的代码,因此异常处理表也是帧数据区重要的一部分。


分享到:


相關文章: