对象内存布局
在Hotspot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头、实例数据、对齐填充。
对象头
在64为系统中,Mark word 占了8个字节,cla ss Pointer 占了8个字节。从jdk1.8开始,存在指针压缩,class Pointer 占4个字节。
jvm默认开启的:-XX:+UserCompressedClassPointers 压缩指针
对象标记 Mark Word
存储着:hash码、gc标记、gc次数(年龄)、同步锁标记、偏向锁持有者
gc的分代年龄只有4位,所以最大年龄15
类元信息(类型指针class Pointer)
类元信息就是new 某个对象的模板,即ObjectDemo1 o1 = new ObjectDemo1(); 的ObjectDemo1。 里面的属性为实例数据。
对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。
class Resouce{ //只含对象头
}
class Book{//有实例数据,16字节(忽略指针压缩)+ 4字节 + 1字节 = 21字节,由于对齐填充为24字节
int id;
boolean flag;
}
实例数据
存放类的属性(field)数据信息,包括父类属性信息。
对齐填充
虚拟机要求对象起始地址必须是8字节的整数倍。它的存在不是必须的,仅仅是为了字节对齐这部分内存按照8字节补充对齐。