news 2026/9/4 6:18:01

02-JAVA对象在内存里长什么样

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
02-JAVA对象在内存里长什么样

本篇是「JVM 与性能调优系列」第 2 篇。

你每天new成百上千个对象,但有没有想过:这行new Object()创造出来的东西,在内存里到底占多少字节、长什么样?

很多人以为「对象就是几个字段加起来的大小」,结果线上一算内存占用,差出好几倍。今天我们用java -XX:+PrintFieldLayout之外的更直观方式,把对象拆开看个明白。


一、一个对象 = 对象头 + 实例数据 + 对齐填充

在 HotSpot 里,对象在堆中的布局分三块:

| 对象头 Mark Word | 对象头 Klass Pointer | 实例数据 | 对齐填充 |
  • 对象头(Header):固定开销,承载「对象自己的元数据」
  • 实例数据(Instance Data):你定义的字段,包括父类继承来的
  • 对齐填充(Padding):JVM 要求对象大小是 8 字节的整数倍,不足就补

二、对象头之 Mark Word:对象的「身份证」

Mark Word 在 64 位 JVM 上占8 字节,存的是和对象状态强相关的运行时数据,而且同一块 8 字节,在不同状态下存的东西会变

状态Mark Word 存的内容
无锁哈希码(hashCode) + 分代年龄 + 是否偏向锁标志
偏向锁偏向的线程 ID
轻量级锁指向栈中锁记录的指针
重量级锁指向互斥量(monitor)的指针
GC 标记空(被标记时复用)

看到没?分代年龄就在这 8 字节里——占 4 个比特位,所以最大就是 15(MaxTenuringThreshold默认 15 不是拍脑袋定的,是位数限制)。hashCode()第一次调用才会写进 Mark Word,这也是为什么未调用过hashCode的对象和调用过的对象布局不同。


三、对象头之 Klass Pointer:指向「类」的指针

Klass Pointer 指向方法区的类元数据(Klass 结构),JVM 靠它知道「这个对象是哪个类的实例」。

指针压缩是关键优化:64 位 JVM 指针本应 8 字节,但开启-XX:+UseCompressedOops(JDK 6 起默认开)后,Klass Pointer 压成4 字节。原理是堆上限通常 < 32G,用「基址 + 偏移×8」就能寻址,省下一半头开销。一旦堆超过约 32G,压缩自动失效,对象头回到 8 字节,内存占用明显上升——这就是为什么堆不是越大越好,32G 是条隐形的分水岭


四、实例数据:字段怎么排

字段按类型宽度排列,相同宽度会分到一起,顺序大致是:long/doubleint/floatshort/charbyte/boolean→ 引用类型。父类字段在子类字段之前。

引用类型字段在开启指针压缩时也只占 4 字节。所以一个只有一个int字段的对象:8(Mark) + 4(Klass) + 4(int) = 16 字节,正好 8 的倍数,无需填充。


五、数组对象多了「长度」

数组对象比普通对象多一个4 字节的长度字段(因为数组需要知道自己多长),所以new int[0]也要 16 字节:8 + 4 + 4(长度) = 16。


六、算一笔账:为什么你的对象比你以为的大

一个看似轻量的Point(x, y)只有两个int

8(Mark) + 4(Klass) + 4(x) + 4(y) = 20 → 对齐到 24 字节

如果换成两个Integer(对象)引用,每个Integer本身又是 16 字节对象 + 4 字节引用,开销直接翻倍。这就是大量小对象场景里,用基本类型数组(int[])比List<Integer>省内存几个数量级的原因——也是调优时「对象膨胀」排查的着眼点。


七、对齐填充的副作用:伪共享(铺垫)

填充除了对齐,有时还被用来故意撑大对象避免伪共享(两个变量在同一缓存行被不同 CPU 核心改写,互相失效)。第 12 篇讲性能时会再提@Contended。这里先记住:对齐不是浪费,是硬件友好的代价。


八、亲手量一量:JOL 工具

别光听我说,OpenJDK 有个JOL(Java Object Layout)工具能打印真实布局:

System.out.println(ClassLayout.parseInstance(newPoint(1,2)).toPrintable());

输出会清楚列出 Mark Word、Klass Pointer、各字段的偏移(offset)与大小,以及末尾 padding。强烈建议你在自己项目里跑一遍——你会发现很多「以为很小」的对象其实带着 12~16 字节的固定税。

九、字段顺序也影响内存

前面说相同宽度的字段会聚到一起。如果你把booleanlong交错定义,JVM 仍会按宽度重排,但父类字段永远先于子类这一条无法改变。所以继承层级越深,对象头前面的「父类实例数据」就越多。高频小对象(如 DTO、事件对象)应尽量减少不必要的父类字段,避免无谓膨胀。


十、压缩指针何时失效

前面说开启-XX:+UseCompressedOops后 Klass Pointer 压成 4 字节。但有个硬限制:压缩指针用「基址 + 偏移×8」寻址,能覆盖的最大堆是32G 左右(4G × 8 = 32G,实际约 32G 出头)。

一旦你设-Xmx=40g,JVM自动关闭压缩指针,Klass Pointer 变回 8 字节,每个对象头多 4 字节。看似只多 4 字节,但在十亿级对象的内存里,这就是几个 G 的差距——而且大堆本身 GC 更慢。

结论:除非真需要,别轻易把堆推过 32G。超过这条线,往往不如「两个 30G 实例」来得划算。


十一、对象头与锁升级的伏笔

本篇提到 Mark Word 在不同锁状态下存不同内容(偏向锁/轻量/重量)。这其实是后面「并发与锁」的入口:当多个线程竞争同一个对象,JVM 会让它的 Mark Word 在几种状态间升级,升级过程就记录在对象头那 8 字节里。

今天我们只要记住:对象头不是死数据,它动态记录着对象的运行时状态(锁、哈希、年龄)。理解它,才能理解后面为什么synchronized有时快、有时慢。


总结

一个对象 =8 字节 Mark Word(锁/哈希/年龄)+ 4 字节 Klass 指针(压缩后)+ 实例数据 + 对齐填充。指针压缩让我们在 <32G 堆下省一半头开销,分代年龄被锁死在 15,数组多一个长度字段。下次有人问「这个对象多大」,别只加字段——把 12 字节固定头和对齐算进去,才靠谱。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 6:17:50

踩3次GMP整改坑,总结出工业煎药处方全链路数据记录合规方案

前阵子帮一家饮片企业做煎药系统的GMP合规整改,光处方追溯这一项就连续被打回三次。 第一次是处方修改直接覆盖原数据,查不到历史版本;第二次是批次只绑定了处方编号,没绑定版本号,说不清当时用的哪套参数;第三次是执行过程中操作工临时改了温度,系统没留痕,也没走审批…

作者头像 李华
网站建设 2026/9/4 6:17:25

十年前的电脑,通过这个软件起死回生,不卡顿

我尝试过很多优化电脑的工具和软件&#xff0c;但大多数都没用&#xff0c;但今天这个工具是例外。这个工具我已经使用了一个月了&#xff0c;明显感觉到老的笔记本电脑有了质的飞跃&#xff0c;通过这个软件真的能让老电脑重回第二春&#xff0c;推荐给大家。 一、电脑情况和配…

作者头像 李华
网站建设 2026/9/4 6:15:50

Django DRF与Vue构建企业管理系统:全栈实战与架构设计详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 6:14:03

【AI大模型进阶】使用 ONNX 加速模型推理(CPU友好)

【AI大模型进阶】使用 ONNX 加速模型推理(CPU友好) 这是【AI大模型进阶】系列第一百一十六课,聚焦CPU设备大模型推理低效痛点,解决普通PyTorch原生推理速度慢、占用CPU资源高、低配置设备运行卡顿、本地部署体验差等核心问题,从零落地一套轻量化、CPU友好的ONNX推理加速方…

作者头像 李华
网站建设 2026/9/4 6:13:48

空-地-机械臂协同机器人:从ROS仿真到工程落地的核心技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 6:11:18

ComfyUI+Flux模型实现AI角色三视图生成:从原理到实战

简介&#xff1a;本资源是面向ComfyUI进阶用户与AIGC服装设计实践者的OOTD&#xff08;Outfit of the Day&#xff09;三视角自定义模特工作流配置文件&#xff0c;专为解决虚拟试衣、多角度服饰展示等场景中模型姿态控制与视角一致性难题而设计。压缩包仅含1个核心文件&#x…

作者头像 李华