JVM-栈帧
栈帧(Stack Frame)
- 栈帧是Java虚拟栈中的单位元素。
- 栈帧存储了局部信息表、操作数栈、动态链接、方法返回地址、附加信息。
- 一个线程调用一个方法就会创建一个栈帧。(所以调用的越多,栈帧创建的越多,例如递归。当栈帧超过虚拟栈最大内存时,会抛出StackOverFlowError)
- 在Running的线程,只有当前栈帧有效(Java虚拟栈中栈顶的栈帧),与当前栈帧相关联的方法成为当前方法。
- 线程每调用一个新方法都会往虚拟栈中压入新栈帧,也就是成为当前栈帧。当一个方法执行完成退出时,此方法对应的栈帧也会相应出栈。
局部信息表
每个栈帧中都包含一组局部变量表的变量列表,存放方法参数、方法内定义的局部变量。
操作数栈(Operand Stack)
- 后入先出栈。
- 方法的执行操作在操作数栈中完成(字节码指令往操作数栈进行入栈和出栈)。
动态链接(Dynamic Linking)
每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,这个引用是为了方法调用过程中动态链接。
方法返回地址
当一个方法执行后只有两种方式可以退出该方法:
1. 方法返回指令:执行引擎遇到方法返回字节码指令,这时候可能会有返回值传递给上层的方法调用者,这种退出方式成为正常完成出口。
2. 异常退出:在方法执行过程中遇到异常,并且没有处理这个异常,就会导致方法退出。
不论采用何种方法退出的方式,在方法退出之后,都需要返回到方法被调用的位置,程序才能继续执行。
方法退出的过程实际上就等于把当前栈帧出栈,因此退出可能执行的操作有:
1. 恢复上层方法的局部变量表和操作数栈。
2. 把返回值(如果有返回值)压入调用者栈帧的操作数栈中。
3. 调整程序计数器的值以指向方法调用指令后面的一条指令。
//todo
参考资料:
https://zhuanlan.zhihu.com/p/76862224
https://www.jianshu.com/p/ecfcc9fb1de7

浙公网安备 33010602011771号