likes
comments
collection
share

JVM中对象的内存布局

作者站长头像
站长
· 阅读数 82

本文源自Recently祝祝,创自Recently祝祝。转载请标注出处。

此解决方式在企业中有所应用,适合Java初级开发学习,参考。

本文字数与行数,耐心阅读必有收获

JVM中对象的内存布局

1.前言

前一篇文章中,说了对象的生命周期,这篇文章说一下对象的内存布局。其实说对象的内存布局,说的就是对象在堆内存中的布局,对象在JVM中存储在堆中。

全文以jdk1.8做讲解,jdk不同版本的内存布局会有所不同

2.对象的三个区

一个对象的内存分为三个区域:对象头(大小固定,12字节),实例数据(根据写入的数据决定大小)、对齐填充(一般肯定不会出现单数的直接总数的形式,必须为8字节的倍数,不够的自动补齐)

JVM中对象的内存布局 实例数据的大小:

JVM中对象的内存布局

对象头:32位8字节。64位12字节

  • 标记字段:存储自身对象的运行时数据,对象的哈希码值,GC分代的年龄,锁状态等信息
  • 数组长度:有数组他就有长度,没有数组就没长度,4个字节
  • 类型指针:对象指向元数据的指针,默认开启压缩模式4字节
  • 对齐补充:字节总数需要是8的整数倍

实例数据:根据数据类型定内存大小,生成对象,对象的非静态变量也会进入。

对齐补充:字节总数需要是8的整数倍

3.实施案例

首先需要导入Maven,Http接口的导入,需要maven版本在3.8以下,不然会报错。因为maven3.8以上切换了更安全的https,已经不适应http接口了。所以最简单的解决报错的方式就是降低maven版本,我所用的测试版本是maven3.5.0

JVM中对象的内存布局 使用了开源库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:空对象内存布局

JVM中对象的内存布局

使用ClassLayout.parseInstance(o).toPrintable()方法,将Object对象o的内存布局信息打印出来。

使用openjdk-jol输出的内存布局信息可能会因为不同JDK版本、不同JVM实现以及不同的JVM参数而有所不同。我这里使用的是jdk1.8

JVM中对象的内存布局 从图片可以看出中空对象内存大小是16字节=对象头12字节+然后对齐补充4字节

3.2实施案例02:被赋值对象内存布局

JVM中对象的内存布局 使用ClassLayout.parseInstance(first).toPrintable()方法,将Shimmer对象first的内存布局信息打印出来。

在代码中,先创建一个Shimmer对象first,并使用ClassLayout.parseInstance(first).toPrintable()方法输出 其内存布局信息。

然后,通过调用first对象的setBoolnum()、setIntnum()和setString()方法,给其成员变量赋值。最后,再次使用ClassLayout.parseInstance(first).toPrintable()方法输出其内存布局信息。

JVM中对象的内存布局

从图片可以看出中内存大小是24字节=对象头12字节+int数据类型4字节+String数据类型4字节+boolean数据类型1字节+然后对齐补充3字节 文章全为个人理解,如果发现部分跟你所知道的有出入,欢迎在评论区指出,欢迎探讨。

转载自:https://juejin.cn/post/7226904491050909733
评论
请登录