JVM 真香系列:方法区、堆、栈之间到底有什么关系
关注“Java后端技术全栈”
回复“000”获取大量电子书
![](https://static001.geekbang.org/infoq/e5/e53788e3a63aa0724d6956dc8396d0bf.png)
栈指向堆
![](https://static001.geekbang.org/infoq/4e/4e8555736829e89812d2629a201c1b5b.png)
如果在栈帧中有一个变量,类型为引用类型,比如:
这时候就是典型的栈中元素obj指向堆中的Object对象,result的指向和obj的指向为同一个对象。
![](https://static001.geekbang.org/infoq/f6/f63bb223479474b15b5642f3e14c033c.png)
使用命令
javac -g:vars JvmCodeDemo.java
进行编译,然后再使用
javap -v JvmCodeDemo.class >log.txt
然后打开log.txt
文件
![](https://static001.geekbang.org/infoq/08/087132c6f54586b1857b636fb81cec7a.png)
如果还有疑惑,可以再结合上面的字节码图和关系图来看,这样理解就更轻松些。
方法区指向堆
方法区中会存放静态变量,常量等数据。
如果是下面这种情况,就是典型的方法区中元素指向堆中的对象。
![](https://static001.geekbang.org/infoq/f9/f9cf4b6b9696c5c1d89479a55789201a.png)
堆指向方法区
方法区中会包含类的信息,对象保存再堆中,创建一个对象的前提是有对应的类信息,这个类信息就在方法区中。
![](https://static001.geekbang.org/infoq/c7/c797dfe10b292a04e5860c56304746d2.png)
Java对象内存布局
![](https://static001.geekbang.org/infoq/74/74f4d906055ce2ed7832f41ac25ae1d5.png)
一个Java对象在内存中包括3个部分:对象头、实例数据和对齐填充
![](https://static001.geekbang.org/infoq/ee/eef5511cbc7d66d79cbc7b5ee8f3138a.png)
推荐阅读:
关注公众号“Java后端技术全栈”
免费获取500G最新学习资料
版权声明: 本文为 InfoQ 作者【田维常】的原创文章。
原文链接:【http://xie.infoq.cn/article/6da7dc2b88aecf50b7a725215】。文章转载请联系作者。
评论