栈帧是JVM中的一种存储结构,它是一条线程中程序运行的主要存储位置,深入理解这部分与其他存储位置的联系可以让我们更加轻松的了解整个JVM运行结构
栈(虚拟机栈)
除了虚拟机栈,还有操作数栈和本地方法栈,注意不要混淆;
栈的结构特点是FILO(后进先出),这很符合程序在调用方法时的特点,所以用栈来存储再合适不过。
当每一次创建一条线程的时候,JVM就会创建一个栈。
整体结构大概这样:
当然,线程中不止有栈,还有程序计数器(一部分)等其他被调用的东西,这里暂不展开;
从图中可以看出,栈帧中还有四个部分,接下来让我们看看这四部分都干嘛用的。
局部变量表
局部变量表,顾名思义,是用来存放局部变量的
操作数栈
操作数栈是用来存放操作数的,这么说可能有些不清楚,举个例子:
int a=1
,这是个赋值语句。
创建这个变量时,会先在局部变量表生成一个a的内存区域,然后,会在操作数栈中压入一个1,再出栈,将这个1赋值给a。这就是操作数栈的功能,用于暂时的存储要操作的数据。
动态链接
动态链接里面存放的是符号被转换后的物理地址。
(ps:符号是一个抽象名称,例如方法名,变量名等,都是符号)
方法出口
方法出口里面存放的是当前方法的调用者方法现状。
举个例子:方法A中的第四行调用了方法B,那么方法B执行完后,是需要从A的第四行开始往下执行;那么这个时候就需要记住方法A当前的运行情况,否则等B执行完后,又要从A的开头执行;这个记录A运行情况的位置,就是方法出口。
当然,方法也不一定只会返回到调用者,也会有返回到异常的情况。
以上是笔者阅读资料结合自己的理解所写,如有错误欢迎指出,望共同进步,peace~