Object
在开启了压缩指针的情况下,Object 默认会占用 12 个字节,但是为了避免伪共享问题,JVM 会按照 8 个字节的倍数进行填充,所以会填充 4 个字节变成 16 个字节长度。
在关闭压缩指针的情况下,Object 默认会占用 16 个字节,16 个字节正好是 8 的整数倍,因此不需要填充
OOP
在 HotSpot 虚拟机里面,(如图)一个对象在堆内存里面的内存布局是使用 OOP 结构来表示的,
它主要分为三个部分:
- (如图)对象头,包括 Markword、类元指针、数组长度其中 Markword 用来存储对象运行时的相关数据,比如 hashCode、gc 分代年龄等。在 64 位操作系统中占 8 个字节,32 位操作系统中占 4 个字节类元指针指向当前实例对象所属哪个类,开启指针压缩的情况下占 4 个字节,未开启则占 8 个字节数组长度只有对象数组才会存在,占 4 个字节
- 实例数据,存储对象中的字段信息
- 对齐填充,Java 对象的大小需要按照 8 个字节或者 8 个字节的倍数对齐,避免伪共享问题。
因此,一个空的对象,在开启压缩指针的情况下,占 16 个字节其中 Markword 占 8 个字节、类元指针占 4 个字节, 对齐填充占 4 个字节。