Java 对象内存布局

本文详细解析了Java对象在虚拟机中的内存布局,特别关注对象头的结构,包括标记字段、类型指针和数组长度记录。指出64位系统上空对象和数组对象的内存占用,强调在开发中避免使用包装类型和枚举类型以减少内存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在虚拟机中,Java对象在内存中的布局可以分为三块:

  • 对象头(Header) :包含 markword 标记字段类型指针32 位上大小是 8 个字节64 位 16 个字节
  • 实例数据(Instance Data):包含了对象的所有成员变量,其大小由各个成员变量的大小决定,HotSpot虚拟机的默认分配策略中,宽度相等的字段总是被分配到一起存放,如longdouble, shortcharbyteboolean
  • 对齐填充(Padding) :占位符的作用,HotSpot 虚拟机要求对象的大小必须是 8 字节的整数倍因为对象头部分被精心设计成是 8 字节的倍数(1倍或2倍)),这部分并不是必然存在的,如果对象实例数据没有对齐的话,就需要通过对齐填充进行补全。

在这里插入图片描述
在这里插入图片描述

对象头又包括:

  • markword 标记字段哈希码、GC分代年龄、锁状态等,32位上是4字节,64位8字节
  • 类型指针指向对象的类型元数据的指针JVM 通过这个指针来确定这个对象是属于哪个类的实例32 位 4 字节,64 位开启指针压缩 4 字节,否则 8 字节,jdk 1.8 默认开启指针压缩后为 4 字节
  • 数组长度如果对象是一个数组对象, 那在对象头中还必须有一块数据用于记录数组长度。 4 字节

在这里插入图片描述

对于 64 位上的一个空对象:

在这里插入图片描述

也就是说,在 64 位系统上,不开启指针压缩的情况下,一个空对象也要占用 16 字节的大小,而如果这个对象是数组对象,还要额外占用 4 字节,即 20 字节。

所以,在开发中应当尽量避免使用包装类型和枚举类型作为参数类型设计,使用包装类型除了拆装箱的开销外,在数据规模较大的情况下,还有可能占用较大的内存或者造成内存抖动。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值