对象的大小

张开发
2026/5/31 15:08:35 15 分钟阅读
对象的大小
Java对象的大小由三部分组成‌对象头Object Header‌、‌实例数据Instance Data‌ 和 ‌对齐填充Padding‌。一、对象头Object Header对象头是每个Java对象都必须包含的部分它存储了对象的元数据主要包括以下两个部分1‌. Mark Word标记字段‌存储对象的运行时信息如哈希码HashCodeGC分代年龄锁状态标志无锁、偏向锁、轻量级锁、重量级锁线程持有的锁偏向线程ID与偏向时间戳在64位JVM中Mark Word通常占 ‌8字节‌默认开启指针压缩时。2‌. 类型指针Class Pointer‌指向该对象所属类的元数据即方法区中的类信息。在64位JVM中如果开启了指针压缩默认开启-XX:UseCompressedClassPointers类型指针占 ‌4字节‌否则占 ‌8字节‌。⚠️ 如果对象是数组对象头还会包含一个 ‌数组长度字段‌占4字节。二、实例数据Instance Data实例数据是对象中定义的非静态字段的实际内容其大小取决于字段类型和数量。JVM会按照特定规则对字段进行排序以减少填充排序规则如下‌long / double‌ → 8字节‌int / float‌ → 4字节‌short / char‌ → 2字节‌byte / boolean‌ → 1字节注意每个boolean单独占1字节不会压缩为1bit例如一个类定义如下publicclassExample{longa;intb;bytec;Objectd;}在开启指针压缩的64位JVM中字段可能按以下顺序排列a (8字节)b (4字节)c (1字节) 填充(3字节)d (4字节)因此实例数据总大小为8 4 1 3 4 ‌20字节‌。三、对齐填充Padding为了提高内存访问效率JVM要求对象的总大小必须是 ‌8字节的整数倍‌。如果对象的实际大小不是8的倍数则会通过填充字节来补齐。例如若对象头为16字节实例数据为20字节则总大小为36字节。由于36不是8的倍数需向上对齐到40字节5×8因此需要填充4字节。总结Java对象的大小 对象头大小 实例数据大小 对齐填充大小在默认情况下64位JVM 开启指针压缩对象头大小‌16字节‌实例数据大小根据字段类型和数量计算对齐填充确保总大小为8的倍数

更多文章