一、总述
Java虚拟机以方法作为最基本的执行单元,栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机 运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接、 返回地址等信息。每一个方法从调用开始至执行完成过程,都对应着一个栈帧在虚拟机栈里 面从入栈到出栈的过程。每一个线程对应了JVM中一个栈帧。
二、示例
1、只有main方法无返回值
Java代码:
public class Hello {
public static void main(String[] args) {
int i = 100;
}
}
字节码:
bipush 100
istore_l
return
栈帧情况:
此时栈帧中局部变量表中只有i这个变量,操作栈中的操作就是将100赋给i。
2、非main方法无返回值
Java代码:
public void m1() {
int i = 200;
}
字节码:
sipush 200
istore
return
栈帧情况:
此时栈帧中局部变量表中只有i这个变量,操作栈中的操作就是将100赋给i。
3、main方法调用其它方法
Java代码:
public static void main(String[] args) {
Hello_o2 h = new Hello_o2();
h.m1();
}
public void m1() {
int i = 200;
}
字节码:
栈帧情况:
具体的实现流程是main方法先执行,再新建完对象后,调用对象的方法,之后main方法通过动态链接找到m1方法,之后将m1方法入栈,然后执行m1方法。
参考文章:
Java字节码执行引擎——运行时栈帧结构_LCB2018的博客