首页 > 编程语言 >引用类型对象头内存占用详解

引用类型对象头内存占用详解

来源:互联网 2026-06-25 08:01:07

引用对象的对象头是固定内存开销起点,大小不随字段变化,但受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:用于存储哈希码、GC分代年龄、锁状态标志、偏向锁的线程ID、GC标记位等运行时元数据。在64位JVM中,这一块固定占用8字节。
  • 类型指针(Klass Pointer):指向该对象所属类的元数据(位于元空间)。其大小取决于是否启用了压缩指针:
    – 启用压缩指针(-XX:+UseCompressedOops,默认开启)→ 占4字节;
    – 关闭压缩指针 → 占8字节。

数组对象额外多一个字段

数组虽然是引用类型,但其对象头除了Mark Word和类型指针外,还多一个数组长度字段(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字节的起步价,就是引用类型对象不可省略的基础成本。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。