引用类型对象的对象头是其内存开销的固定起点,不随字段增减而变化,但受JVM位数和压缩指针设置直接影响:64位JVM默认压缩下,普通对象头为12字节(Mark Word 8B + Klass Pointer 4B),数组对象头为16字节(+ Length 4B);32位JVM则均为8字节和12字节;对齐填充后空Object实际占16字节。
引用类型对象的对象头是其内存开销的固定起点,不随字段增减而变化,但受JVM位数和压缩指针设置直接影响。
所有Java引用类型对象(包括数组、String、自定义类等)在堆中分配时,对象头必含以下两项:
数组是引用类型,除上述两项外,对象头还包含一个数组长度字段(Length),固定占4字节(32位表示足够覆盖最大数组长度)。因此:
对象头只是起点,后续还需叠加实例数据与对齐填充。但仅看对象头本身:
以HotSpot为例,new Object()对象头12字节 + 实例数据0字节 = 12字节,但JVM要求对象总大小必须是8字节对齐。12向上对齐到最接近的8的倍数是16,因此补4字节填充 → 实际占用16字节堆空间。这个“16字节起步”是引用类型不可省略的基础成本。