JVM中对象的内存布局
本文源自Recently祝祝,创自Recently祝祝。转载请标注出处。
此解决方式在企业中有所应用,适合Java初级开发学习,参考。
本文字数与行数,耐心阅读必有收获
1.前言
前一篇文章中,说了对象的生命周期,这篇文章说一下对象的内存布局。其实说对象的内存布局,说的就是对象在堆内存中的布局,对象在JVM中存储在堆中。
全文以jdk1.8做讲解,jdk不同版本的内存布局会有所不同
2.对象的三个区
一个对象的内存分为三个区域:对象头(大小固定,12字节),实例数据(根据写入的数据决定大小)、对齐填充(一般肯定不会出现单数的直接总数的形式,必须为8字节的倍数,不够的自动补齐)
实例数据的大小:
对象头:32位8字节。64位12字节
- 标记字段:存储自身对象的运行时数据,对象的哈希码值,GC分代的年龄,锁状态等信息
- 数组长度:有数组他就有长度,没有数组就没长度,4个字节
- 类型指针:对象指向元数据的指针,默认开启压缩模式4字节
- 对齐补充:字节总数需要是8的整数倍
实例数据:根据数据类型定内存大小,生成对象,对象的非静态变量也会进入。
对齐补充:字节总数需要是8的整数倍
3.实施案例
首先需要导入Maven,Http接口的导入,需要maven版本在3.8以下,不然会报错。因为maven3.8以上切换了更安全的https,已经不适应http接口了。所以最简单的解决报错的方式就是降低maven版本,我所用的测试版本是maven3.5.0
使用了开源库openjdk-jol,用于输出Java对象的内存布局信息。
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>
报错显示:会直接加载不进去,就算加载进去了也会报错:Since Maven 3.8.1 http repositories are blocked.
3.1实施案例01:空对象内存布局
使用ClassLayout.parseInstance(o).toPrintable()方法,将Object对象o的内存布局信息打印出来。
使用openjdk-jol输出的内存布局信息可能会因为不同JDK版本、不同JVM实现以及不同的JVM参数而有所不同。我这里使用的是jdk1.8
从图片可以看出中空对象内存大小是16字节=对象头12字节+然后对齐补充4字节
3.2实施案例02:被赋值对象内存布局
使用ClassLayout.parseInstance(first).toPrintable()方法,将Shimmer对象first的内存布局信息打印出来。
在代码中,先创建一个Shimmer对象first,并使用ClassLayout.parseInstance(first).toPrintable()方法输出 其内存布局信息。
然后,通过调用first对象的setBoolnum()、setIntnum()和setString()方法,给其成员变量赋值。最后,再次使用ClassLayout.parseInstance(first).toPrintable()方法输出其内存布局信息。
从图片可以看出中内存大小是24字节=对象头12字节+int数据类型4字节+String数据类型4字节+boolean数据类型1字节+然后对齐补充3字节 文章全为个人理解,如果发现部分跟你所知道的有出入,欢迎在评论区指出,欢迎探讨。
转载自:https://juejin.cn/post/7226904491050909733