当前位置: 首页 > news >正文

Java 对象内存布局详解

Java 对象内存布局详解

Java 对象在内存中的存储布局可分为三个主要部分:对象头(Header)实例数据(Instance Data) 和对齐填充(Padding)。其中对象头是理解 JVM 中对象存储机制的关键。


一、对象头(Object Header)

对象头包括两类信息:Mark Word 和类型指针(Class Pointer),如果对象是数组,则还包含数组长度

1.1 Mark Word

用于存储对象自身的运行时数据,长度在 64 位 JVM 中为 8 字节,主要包括:

  • 哈希码(hashCode)

  • GC 分代年龄

  • 锁状态标志(如偏向锁、轻量级锁、重量级锁)

  • 线程持有的锁

  • 偏向线程 ID

  • 偏向时间戳等

这些信息并非同时全部存在,而是根据对象状态复用了同一块存储空间,以节省内存。

1.2 类型指针(Class Pointer)

即指向对象类元数据的指针,JVM 通过该指针确定对象属于哪个类。

  • 在 64 位 JVM 中,不开启压缩时为 8 字节,开启压缩(-XX:+UseCompressedClassPointers,默认开启)后为 4 字节

  • 可使用命令 java -XX:+PrintCommandLineFlags -version 查看是否开启类指针压缩。

注意:32 位 JVM 中类型指针长度为 4 字节,但如今主流环境已普遍使用 64 位 JVM。

1.3 数组长度(仅数组对象有)

如果对象是数组,对象头中还会有一个额外字段记录数组长度,占 4 字节


二、实例数据(Instance Data)

存放对象的所有成员变量(字段),包括从父类继承的字段。其所占空间取决于具体字段类型与数量。

  • 基本类型:如 int 占 4 字节,long 占 8 字节等。

  • 引用类型:在未开启普通对象指针压缩(-XX:+UseCompressedOops,默认开启)时占 8 字节,压缩后为 4 字节。


三、对齐填充(Padding)

由于 HotSpot JVM 要求对象大小必须是 8 字节的整数倍,因此当对象头与实例数据总大小不是 8 的倍数时,会通过对齐填充来补全。这是一种内存对齐手段,旨在提高内存访问效率。


四、示例分析
例1:Object o = new Object()
  • Mark Word:8 字节

  • 类指针(默认开启压缩):4 字节

  • 实例数据Object 无实例字段,因此为 0

  • 总大小:8 + 4 = 12 → 不是 8 的倍数,需填充 4 字节
    ✅ 最终占用:16 字节

若关闭类指针压缩:

  • 类指针为 8 字节,总大小 8 + 8 = 16,无需填充,仍为 16 字节

例2:User u = new User(1, "张三");

假设 User 类含两个字段:int id 和 String name

  • Mark Word:8 字节

  • 类指针(压缩):4 字节

  • 实例数据

    • int id:4 字节

    • String name(引用,压缩后):4 字节

  • 小计:8 + 4 + 4 + 4 = 20 → 非 8 的倍数,需填充 4 字节
    ✅ 最终占用:24 字节


总结

对象内存布局是理解 JVM 内存管理、同步机制和性能优化的基础。具体大小受是否启用指针压缩、字段类型、是否数组等因素影响。若需准确分析对象内存占用,建议使用 JOL(Java Object Layout)工具进行测量。

http://www.dtcms.com/a/344833.html

相关文章:

  • Docker容器化部署实战:Tomcat与Nginx服务配置指南
  • 大模型推理-MTK Neurapilot sdk了解与环境配置-1
  • Unreal Engine UPrimitiveComponent
  • QT5 UI界面上Scroll Area控件显示滚动条
  • 浏览器开发CEFSharp+X86+win7(十三)之Vue架构自动化——仙盟创梦IDE
  • Lua脚本如何执行主程序的C函数
  • 智能二维码QR\刷IC卡\人脸AI识别梯控系统功能设计需基于模块化架构,整合物联网、生物识别、权限控制等技术,以下是多奥分层次的系统设计框架
  • 攻防世界—bug
  • 深度学习①【张量、全连接神经网络、激活函数、交叉熵损失函数】
  • 机器学习之线性回归:原理、实现与实践
  • 定制化鲜狗粮:宠物经济浪潮下的“精准喂养”革命
  • Python 办公自动化实战:Excel 批量处理 + 自动发邮件
  • 博士招生 | 英国谢菲尔德大学 招收计算机博士
  • 数据结构 -- 栈
  • 鹰角网络基于阿里云 EMR Serverless StarRocks 的实时分析工程实践
  • CDN行业中的SA板卡限速是什么
  • 品牌出海狂潮里,独立站支付的「隐形基建」正在改写规则
  • java18学习笔记-JavaDoc的@snippet注释标签
  • 数据结构 -- 队列
  • 【运维自动化-标准运维】变量的高级用法
  • 去中心化的私有货币与中心化的法定货币的对比分析
  • 数据结构与算法-算法-283移动零
  • 深度分析AI边缘盒子在电力行业的应用与发展
  • 【LeetCode】22. 括号生成
  • 欲打造未来感十足的规划馆,应优先引入哪些沉浸式多媒体技术?
  • Spring Start Here 读书笔记:第9章 Using the Spring web scopes
  • 人脸识别驱动的工厂人体属性检测与预警机制
  • C#开源库ACadSharp读取dwg图元的示例
  • 为何她在“传递情报”时会被干扰?—— 探究 TCP 协议在无线环境中的信号干扰问题
  • 算法题复盘+代码解读(2)—— 两数之和