一、总述

Java虚拟机以方法作为最基本的执行单元,栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机 运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接、 返回地址等信息。每一个方法从调用开始至执行完成过程,都对应着一个栈帧在虚拟机栈里 面从入栈到出栈的过程。每一个线程对应了JVM中一个栈帧。

java帧结构 java栈帧_字节码

二、示例

1、只有main方法无返回值

Java代码:

public class Hello {
    public static void main(String[] args) {
       int i = 100;
    }
}

字节码:

bipush 100
istore_l
return

栈帧情况: 

此时栈帧中局部变量表中只有i这个变量,操作栈中的操作就是将100赋给i。

java帧结构 java栈帧_main方法_02

2、非main方法无返回值

Java代码:

public void m1() {
    int i = 200;
}

字节码:

sipush 200
istore
return

栈帧情况:

此时栈帧中局部变量表中只有i这个变量,操作栈中的操作就是将100赋给i。

java帧结构 java栈帧_main方法_03

 

3、main方法调用其它方法

Java代码:

public static void main(String[] args) {
    Hello_o2 h = new Hello_o2();
    h.m1();
}


public void m1() {
    int i = 200;
}

字节码:

java帧结构 java栈帧_main方法_04

java帧结构 java栈帧_Java_05

 

 

栈帧情况:

具体的实现流程是main方法先执行,再新建完对象后,调用对象的方法,之后main方法通过动态链接找到m1方法,之后将m1方法入栈,然后执行m1方法。

java帧结构 java栈帧_main方法_06

参考文章:

Java字节码执行引擎——运行时栈帧结构_LCB2018的博客