对象的内存分布,以HotSpot为例。对象在内存中存储的布局可以分为3个部分:
1、对象头
2、实例数据
3、对齐填充
具体每个部分的描述:
一、
对象头,主要包含MarkWord(标记字段)和ClassPointer类型指针。
Class Pointer是对象指向它的类元数据的指针,JVM需要通过这个指针,来判断这个对象是哪个类的实例。
MarkWord用来存储对象自身运行时的数据。它是实现轻量级和偏向锁的关键。
那么对象自身有哪些数据呢?
如HashCode、GC的分代年龄、锁状态、线程持有的锁、偏向线程ID等等。
二、
实例数据,就是对象的有效信息,比如属性字段等等。
三、
对齐填充,填充的是长度。因为虚拟机要求对象起始地址必须是8字节的整数倍。所以当对象的大小不是8字节的倍数时,就会进行对齐填充,让它变成8字节的倍数,所以该数据不是必须存在的。
举例说明,假如某个对象的大小只有15KB,因为8字节的整数倍,所以在创建内存大小时,实际占用的就是16KB。