针对 JVM 虚拟栈 和栈帧的操作
虚拟机栈:
栈元素是栈帧. 方法调用, 栈帧入栈, 反之出栈.
栈帧: 一个方法的运行空间.
1, 局部变量表: 方法定义的局部变量, 方法的参数存在该表.
实例方法中有个隐含参数 "this", 所以实例方法可以访问该类的实例变量和其他实例方法.
局部变量表中变量的存放顺序: this(如果是实例方法)=> 参数 (如果有)=> 定义的局部变量 (如果有)
slot 是局部变量表中的空间单元, 虚拟机规范规定:
1,32 位之内的数据, 用一个 slot 来存放, 如 int,short,float 等;
2,64 位的数据用连续两个 slot 来存放, 如 long,double;3, 引用类型可 32 位亦可 64 位.
2, 操作数栈: 用来存放操作数.
局部变量表中的变量是不可直接使用的, 如需使用必须通过相关指令将其加载至操作数栈中作为操作数使用.
3, 方法返回地址:
一个方法开始执行后, 只有两种方式可以退出这个方法.
第一种: 执行引擎遇到任意一个方法返回的字节码指令, 这时候可能会有返回值传递给上层的方法调用者, 是否有返回值和返回值的类型将根据遇到的何种方法返回指令来决定, 这种退出的方式称为正常完成出口.
另一种: 方法执行过程中遇到了异常, 并且这个异常没有在方法体内得到处理, 无论是 Java 虚拟机内部产生的异常, 还是代码中使用 athrow 字节指令产生的异常, 只要在本方法的异常表中没有搜索到匹配的异常处理器, 就会导致方法退出,
这种退出称为异常完成出口.
根据下面的代码 模拟 java 虚拟机栈 栈帧的入栈 和出栈操作
- public class Test {
- public static void main(String[] args) {
- new Test().a();
- }
- public void a(){
- b();
- System.out.println("执行 a 方法结束");
- }
- public void b(){
- c();
- System.out.println("执行 b 方法结束");
- }
- public void c(){
- System.out.println("执行 C 方法结束");
- }
- }
来源: https://www.cnblogs.com/dayao666/p/12058876.html