Java对象的内存布局

对象的内存布局

对象的内存分为3个区域,对象头,实例数据,对齐填充

 

1  对象头

包含 两部分信息 

    1.1 对象运行时数据,如 HashCode,GC 分代年龄,锁状态标识,线程持有的锁,偏向线程ID,偏向时间戳等,长度为32bit(32bit的虚拟机)或64bit(64bit的虚拟机 未开启压缩指针),取决于虚拟机的位数。官方称为 Mark Word,Mark Word 没有设计成一个固定的数据结构,对象头信息与对象自身定义的数据无关,考虑到虚拟机的空间效率,它会根据对象的状态复用自己的储存空间。

    1.2 类型指针。对象指向它的类元数据的指针,虚拟机通过这个指针确定这个对象属于那个类。并不是所有的虚拟机实现都必须在对象数据上保留类型指针,也就是说,查找对象的元数据信息不一定要经过对象本身,

      如果对象是一个数组,那么对象头中还有一块内存空间用来保存数组长度,因为对象的类元素据只能确定Java对象的大小,但是数组的类元数据无法确定数组大小。

2 实例数据

,对象真正存储的有效信息,类字段中的内容。

存储顺序受到虚拟机分配策略参数和Java源码中定义顺序上的影响。

虚拟机的字段内存分配策略.jpg

3 对齐填充,起占位符作用,由于HostSpot VM的自动内存管理系统要求对象的其实位置必须是8字节的整数倍。对象头的大小是8字节的整数倍,若对象的实例数据部分的大小不是8字节的整数倍,那么就需要对齐填充。