【深入理解】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就是调用方法,运行时会将方法名替换为具体代码,这就是动态链接的作用
