引用对象的对象头是固定内存开销起点,大小不随字段变化,但受JVM位数和压缩指针影响。64位JVM默认压缩下,普通对象头12字节,数组对象头16字节;32位JVM下分别为8字节和12字节。对齐填充后,空Object实际占用16字节。
引用对象的对象头,也就是内存开销的固定起步价。无论对象中包含多少字段,对象头的大小都是固定的,但会受到JVM运行模式和压缩指针设置的影响。
引用对象的对象头是内存开销的固定起点,大小不随字段变化,但受JVM位数和压缩指针影响:在64位JVM默认压缩下,普通对象头为12字节(Mark Word 8字节 + Klass Pointer 4字节),数组对象头为16字节(多出一个Length 4字节);在32位JVM下,分别为8字节和12字节;经过对齐填充后,空Object实际占用16字节。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
这个固定起点就是对象头。它不随字段增减变化,但直接受JVM位数和压缩指针设置的影响。
那么,对象头具体包含哪些内容?
所有Java引用类型对象——包括数组、String、自定义类等——在堆中分配时,对象头必须包含以下两项:
数组虽然是引用类型,但其对象头除了Mark Word和类型指针外,还多一个数组长度字段(Length),固定占用4字节(32位足以表示最大数组长度)。因此:
对象头只是一个起点,后续还要加上实例数据和对齐填充。仅看对象头本身,不同配置下的大小如下:
以HotSpot为例,new Object()的对象头为12字节,实例数据为0字节,合计12字节。但JVM要求对象总大小必须是8字节对齐。12向上对齐到最近的8的倍数(即16),因此需要补充4字节填充——实际占用16字节堆空间。这个16字节的起步价,就是引用类型对象不可省略的基础成本。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述