JVM真香系列:方法区、堆、栈之间到底有什么关系

205 阅读1分钟
![JVM真香系列:方法区、堆、栈之间到底有什么关系](https://p6-tt.byteimg.com/origin/pgc-image/e8b0ae6b531a4e729f7255261fcc3e2e?from=pc)

栈指向堆

如果在栈帧中有一个变量,类型为引用类型,比如:

package com.tian.my_code.test;

public class JvmCodeDemo {
    public  Object testGC(){
        int op1 = 10;
        int op2 = 3;
        Object obj = new Object();
        Object result=obj;
        return result;
    }
}

这时候就是典型的栈中元素obj指向堆中的Object对象,result的指向和obj的指向为同一个对象。

![JVM真香系列:方法区、堆、栈之间到底有什么关系](https://p3-tt.byteimg.com/origin/pgc-image/d452335356614e8185450ffee423bb6b?from=pc)

使用命令

javac -g:vars JvmCodeDemo.java

进行编译,然后再使用

javap -v JvmCodeDemo.class >log.txt

然后打开log.txt文件

![JVM真香系列:方法区、堆、栈之间到底有什么关系](https://p1-tt.byteimg.com/origin/pgc-image/abe1b2c8e7ee4ed2b60c59a135cc6d78?from=pc)

如果还有疑惑,可以再结合上面的字节码图和关系图来看,这样理解就更轻松些。

方法区指向堆

方法区中会存放静态变量,常量等数据。

如果是下面这种情况,就是典型的方法区中元素指向堆中的对象。

![JVM真香系列:方法区、堆、栈之间到底有什么关系](https://p1-tt.byteimg.com/origin/pgc-image/9608026ae8734d5493b546aa37084ab1?from=pc)

堆指向方法区

方法区中会包含类的信息,对象保存在堆中,创建一个对象的前提是有对应的类信息,这个类信息就在方法区中。

![JVM真香系列:方法区、堆、栈之间到底有什么关系](https://p1-tt.byteimg.com/origin/pgc-image/20f1464a4f614a6c8a6e7fb3bb85fc15?from=pc)

Java对象内存布局

![JVM真香系列:方法区、堆、栈之间到底有什么关系](https://p1-tt.byteimg.com/origin/pgc-image/6d0a8de87ad4429583a3270d6c0f4ed8?from=pc)

一个Java对象在内存中包括3个部分:对象头、实例数据和对齐填充

![JVM真香系列:方法区、堆、栈之间到底有什么关系](https://p1-tt.byteimg.com/origin/pgc-image/c072039409a04e1995b7c76894073a2c?from=pc)