我们知道,Java堆中放的是对象,方法区中放的是常量,静态变量,类元信息,虚拟机栈中
放的是栈帧,那么这三者之间有啥关系呢?
我们看下如下代码,可能例子不是太好,请见谅:
public class Math {
private static Math math = new Math();
public int compute() {
int a = 1;
int b = 2;
int c = (a+b)*10;
return c;
}
public static void main(String[] args) {
Math math = new Math();
math.compute();
}
}
箭头1
类装载子系统将Math.class装载进入JVM虚拟机中,其中Math.class的相关元信息,
静态变量math放在方法区中,但是静态变量math是一个对象,所以对象放在堆中
箭头2
程序执行到main方法的时候,会再虚拟机栈,中创建一个栈帧,栈帧中的局部变量表中会有一个对象的引用math,而对象也存在堆中
箭头3
在执行到math.compute()方法的时候,需要去堆的math对象头中获取指向方法区的元信息,然后找到符号引用
转换为直接引用(该过程为动态链接)