回答
一个空的 Object 对象会占用 16 字节的内存空间。
- 若启用压缩指针,空 Object 对象默认会占用 12 个字节,但是为了满足内存对齐的要求,JVM 会将对象大小填充为8字节的倍数,所以占用 16 个字节
- 若关闭压缩指针,空 Object 对象默认占用 16 个字节
所以,无论是否启用压缩指针,一个空的 Object 对象在64位JVM中占16字节的内存。
详解
在 HotSpot 虚拟机中,一个 Java 对象在堆内存里面的内存布局是使用 OOP
结构来表示的,它主要分为三个部分:
一、对象头
在 Java 中每个对象都有一个对象头,对象头通常包括两个部分:
- Mark Word:用于存储对象的运行时数据,比如哈希码(HashCode)、GC标志、锁状态等。在 64 位 JVM 中,Mark Word 占用8个字节,32 位 JVM 占 4 个字节
- Class Pointer:类型指针,指向对象的类元数据,JVM通过这个指针知道对象是哪个类的实例。它占用字节数跟 JVM 是否开启压缩指针有关系。在开启指针压缩的状况下占 4 字节,未开启状况下占 8 字节。
二、实例数据
实例数据用于存储对象中的各类类型的字段信息(包括从父类继承来的),空对象为 0。
三、对齐填充