方法区、堆和虚拟机栈这三块区域都是存在一定联系的,下面来一一分析下。
栈指向堆
什么情况下,会存在栈指向堆呢?看一个代码:
private void A(){
User user=new User();
//todo
}
线程在执行A方法时,一定是在虚拟机栈中完成,而引用变量user会存放在局部变量表中,真实的user对象存放在堆中,这时候就是典型的栈中元素指向堆中的对象。
方法区指向堆
什么情况下,会存在方法区指向堆呢?看一个代码:
private static User user=new User();
引用变量user是静态的,所以存放在方法区中,而真实的user对象存放在堆中。所以,这就形成了方法区指向堆。
堆指向方法区
既然方法区可以指向堆,那么堆能否指向方法区?
答案是可以的,不过这个不方便代码描述。试想一下,方法区中会包含类的信息,堆中会有对象,那怎么知道对象是由哪个类创建的呢?所以,在对象的对象头中会有一个指针,用来指向方法区对应的类元数据信息。