【深入理解】JVM虚拟机栈是如何工作的?

虚拟机栈是Java虚拟机运行时数据区的一部分

虚拟机栈、本地方法栈和程序计数器是线程私有的,它们之间的关系如图所示:

本文主要探索虚拟机栈的内存结构。

虚拟机栈的结构组成

一个线程可能会执行多个方法,在虚拟机栈里面,每个方法都会有一个栈帧。一个栈帧就相当于堆栈的一个元素。当准备执行方法的时候,就把栈帧压入栈中,方法执行完毕后就出栈。

虚拟机栈的内部由局部变量表、操作数栈、动态链接、方法出口组成

如图所示:

局部变量表负责存储方法内定义的局部变量,操作数栈主要是存储常量、对象地址,而动态链接就是解析在方法内调用其他方法的名字,将其他方法的名字映射成具体的一段代码(因为是在运行时解析的,所以称为动态链接),方法出口的作用在于栈帧执行完毕后回到线程的某个具体位置。

虚拟机栈的运行过程

主要理解一下它的内部结构在执行代码的时候是怎么配合起来的

现在有这段代码:

public class Main {
          
   
    public static void main(String[] args) {
          
   
        int a = 5;
        int b = 3;
        int c = a + b;
    }
}

编译之后

利用javap -c Main.class进行反编译,得到如下代码:

以上反编译的结果可以看到操作数栈和局部变量表的工作方式。

现在来看看动态链接

将以上代码做如下修改,在main方法内调用add()方法:

public class Main {
          
   
    public static void main(String[] args) {
          
   
        int a = 5;
        int b = 3;
        int c = add(a, b);
        System.out.println(c);
    }

    private static int add(int a, int b) {
          
   
        return a + b;
    }
}

反编译得到的结果:

invokestatic就是调用方法,运行时会将方法名替换为具体代码,这就是动态链接的作用

经验分享 程序员 微信小程序 职场和发展