最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
引用类型对象头内存占用分析
时间:2026-06-23 08:40:52 编辑:袖梨 来源:一聚教程网
引用类型对象的对象头是其内存开销的固定起点,不随字段增减而变化,但受JVM位数和压缩指针设置直接影响:64位JVM默认压缩下,普通对象头为12字节(Mark Word 8B + Klass Pointer 4B),数组对象头为16字节(+ Length 4B);32位JVM则均为8字节和12字节;对齐填充后空Object实际占16字节。
引用类型对象的对象头是其内存开销的固定起点,不随字段增减而变化,但受JVM位数和压缩指针设置直接影响。
对象头由两部分组成
所有Java引用类型对象(包括数组、String、自定义类等)在堆中分配时,对象头必含以下两项:
- Mark Word:存储哈希码、GC分代年龄、锁状态标志、线程ID(偏向锁)、GC标记位等运行时元数据。在64位JVM中固定占8字节。
-
类型指针(Klass Pointer):指向该对象所属类的元数据(位于元空间)。是否压缩决定其大小:
– 启用压缩指针(-XX:+UseCompressedOops,默认开启)→ 占4字节;
– 关闭压缩指针 → 占8字节。
数组对象额外多1个字段
数组是引用类型,除上述两项外,对象头还包含一个数组长度字段(Length),固定占4字节(32位表示足够覆盖最大数组长度)。因此:
- 普通对象(如new Object()):对象头 = 8(Mark Word) + 4(压缩类型指针) = 12字节;
- 数组对象(如new int[0]):对象头 = 8 + 4 + 4 = 16字节。
对齐填充前的最小对象大小
对象头只是起点,后续还需叠加实例数据与对齐填充。但仅看对象头本身:
- 64位JVM + 压缩指针(主流配置):普通对象头为12字节,数组为16字节;
- 64位JVM + 无压缩指针:普通对象头升至16字节(8+8),数组达20字节(8+8+4);
- 32位JVM:Mark Word为4字节,类型指针为4字节,普通对象头恒为8字节(数组为12字节)。
为什么空对象也占16字节?
以HotSpot为例,new Object()对象头12字节 + 实例数据0字节 = 12字节,但JVM要求对象总大小必须是8字节对齐。12向上对齐到最接近的8的倍数是16,因此补4字节填充 → 实际占用16字节堆空间。这个“16字节起步”是引用类型不可省略的基础成本。
相关文章
- steam上传视频教程 06-23
- 布袋鼠小说app如何进行阅读 06-23
- 快手极速版官方App网页版在哪下载 06-23
- 我的世界2026秒玩入口网址是什么 06-23
- 空洞骑士丝之歌全部五个结局攻略 丝之歌结局达成条件 06-23
- 崩坏3 8.7新春版本福利一览 06-23