对象内存布局与对象头

对象内存布局

在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字节补充对齐。

你可能感兴趣的:(JVM,jvm)