Java对象结构
对象头
由三个区域组成:markword,元数据指针,数组长度标记
markword
8个字节:
用于存储对象自身的运行时数据,
如哈希码(HashCode)(32位=4byte)、GC分代年龄(4位)、
锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,
这部分数据的长度在32位和64位的虚拟机中分别为32bit和64bit,
官方称它为“Mark Word”。
元数据区域指针
8个字节,用于指向元数据区域,默认开始指针压缩,就是4个字节
数组长度标记
4个字节(数组类型对象才会有)
实例数据
存储数据区域
填充区域
虚拟机规定,对象大小必须是8个字节的整数倍,不够的话就填充
使用JOL工具查看内存布局
给大家推荐一个可以查看普通java对象的内部布局工具JOL(JAVA OBJECT LAYOUT),使用
此工具可以查看new出来的一个java对象的内部布局,以及一个普通的java对象占用多少字节。
引入maven
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol‐core</artifactId>
<version>0.10</version>
</dependency>
使用`
System.out.println(ClassLayout.parseInstance(obj)
.toPrintable());
测试
1 public static void main(String[] args) throws InterruptedException {
2 Object obj = new Object();
3 //查看对象内部信息
4 System.out.println(ClassLayout.parseInstance(obj).toPrintable());
5 }
OFFSET:偏移地址,单位字节;
SIZE:占用的内存大小,单位为字节;
TYPE DESCRIPTION:类型描述,其中object header为对象头;
VALUE:对应内存中当前存储的值,二进制32位;
2. 关闭指针压缩后,对象头为16字节:
XX:UseCompressedOops