开启指针压缩,jdk1.6及之后默认开启
-XX:+UseCompressedOops ,开启压缩之后不仅压缩对象头中类型指针,也压缩对象
对象由三部分组成:
1.对象头
2.实例数据
3.对齐填充(保证对象是8个字节的整数倍)
对象头也由三部分组成:
1.MarkWord标记字段(32位占4个字节,64位占8个字节)。存储的都是自身运行时的数据: 对象的hashcode,GC的分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等
2.KlassPointer类型指针(开启压缩占4个字节,关闭压缩占8个字节)
类的元数据的指针
3.数组长度(4字节,只有数组对象才有)
在pom.xml中引入如下依赖,可以通过代码获取对象头及对象所占空间的大小
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.16</version>
</dependency>
ClassLayout classLayout3 = ClassLayout.parseInstance(new User[1]);
System.out.println(classLayout3.toPrintable());