文章目录一、先给你答案16 字节二、逐项拆解16 字节花在了哪第一笔Mark Word —— 8 字节的身份证 体检报告第二笔Klass Pointer —— 4 字节的户口本第三笔对齐填充 —— 4 字节的凑整费三、换个配置结果不一样四、加了属性会怎样五、数组对象呢多了个长度六、自己动手验证用 JOL 量一量七、回到全貌一张图记住八、回答技巧与点评标准回答加分回答面试官点评个人网站你写了一万次new Object()但你有没有认真想过这个对象里面啥都没有它到底占多大内存我第一次被问到这个问题的时候随口说了句8 字节吧面试官微微一笑我就知道——坏了。后来我花了一下午把这事搞明白才发现答案比我想的有趣得多。今天跟你聊聊一个空 Object 到底凭啥占了 16 字节。一、先给你答案16 字节在 64 位 JDK、默认配置下一个new Object()占16 字节。但诡异的是——你写的属性占了 0 字节。16 字节全是 JVM 自己塞进去的基础设施。来我们把 Object 拆开看看钱都花在哪了┌────────────────────────────────────┐ │ Object 内存布局 │ ├──────────────┬──────────┬──────────┤ │ Mark Word │ Klass │ Padding │ │ (8 字节) │ Pointer │ (4 字节) │ │ │ (4 字节) │ │ ├──────────────┼──────────┼──────────┤ │ 你的数据 │ │ │ │ (0 字节) │ │ │ └──────────────┴──────────┴──────────┘ 8 4 0 12 → 对齐到 16 字节就像你租了个 16 平的房间自己啥家具都没放结果全被物业的设备占了——水电表、门禁卡、消防器材一个都少不了。二、逐项拆解16 字节花在了哪第一笔Mark Word —— 8 字节的身份证 体检报告每个对象都有一个 Mark Word里面存的是 JVM 运行时最要紧的信息存储内容说白了是啥HashCode对象的身份证号GC 分代年龄这对象熬过了几次垃圾回收锁状态标志当前有没有人锁住它偏向线程 ID最近谁老用它而且 Mark Word 是复用设计的——不同状态下存的字段不一样。就像一块可擦写的白板无锁时写哈希码加锁了就写锁信息无锁状态 ┌─────────────────────────────────────────────┐ │ HashCode (25bit) │ GC年龄(4bit) │ 0 │ 01 │ └─────────────────────────────────────────────┘ 偏向锁状态 ┌─────────────────────────────────────────────┐ │ 线程ID (54bit) │ GC年龄(4bit) │ 1 │ 01 │ └─────────────────────────────────────────────┘ 轻量级锁 ┌─────────────────────────────────────────────┐ │ 指向锁记录的指针 (62bit) │ 00 │ └─────────────────────────────────────────────┘ 重量级锁 ┌─────────────────────────────────────────────┐ │ 指向 Monitor 的指针 (62bit) │ 10 │ └─────────────────────────────────────────────┘下次面试官问 synchronized 的锁信息存在哪你可以拍着桌子说Mark Word第二笔Klass Pointer —— 4 字节的户口本这个指针指向方法区里的类元数据告诉 JVM“我是Object的实例不是String别搞混了。”那为什么是 4 字节而不是 8 字节因为 JVM 默认开了指针压缩Compressed Oops。什么意思呢打个比方你住在一个小区门牌号本来需要 8 位数字才够用但这个小区不大4 位数字就能给所有房子编号了——那当然用 4 位更省事。JVM 也是这个逻辑堆内存小于 32GB 时4 字节就够寻址了没必要浪费 8 字节。配置Klass Pointer条件压缩开启默认4 字节堆 32GB压缩关闭8 字节堆 ≥ 32GB第三笔对齐填充 —— 4 字节的凑整费8 4 12不是 8 的倍数。JVM 要求对象大小必须是 8 的倍数所以补 4 字节 padding 凑到 16。为啥非要凑整因为 CPU 从内存读数据是按块来的一个缓存行 64 字节如果对象没对齐一个字段可能横跨两块得读两次才能拼出来——太慢了。对齐后保证字段不跨块一次读完。这笔凑整费其实挺划算的——4 字节换来了更快的内存访问速度。三、换个配置结果不一样场景Mark WordKlass Ptr你的数据Padding总计64 位 压缩默认84041664 位 不压缩88001632 位 JVM4400832 位只要 8 字节但现在基本没人用了。64 位不压缩时 Klass Pointer 变 8 字节8816 刚好对齐不用补 padding——巧了结果还是 16。四、加了属性会怎样classMyObject{inta;// 4 字节byteb;// 1 字节longc;// 8 字节}内存布局64 位 压缩┌──────────┬──────────┬────┬────┬──────┬──────┐ │Mark Word │Klass Ptr │ a │ b │ pad │ c │ │ 8 字节 │ 4 字节 │4字节│1字节│3字节 │8字节 │ └──────────┴──────────┴────┴────┴──────┴──────┘ 总计8 4 4 1 3 8 28 → 对齐到 32 字节你注意到没byte b和long c之间多了 3 字节 padding。因为 JVM 会把字段重新排序——先放大的long 8 字节需要 8 对齐小的塞缝隙。byte b后面补 3 字节让long c从 8 的倍数位置开始。这就像搬家师傅摆家具大衣柜必须靠墙对齐放小箱子见缝插针。五、数组对象呢多了个长度int[]arrnewint[0];// 空数组数组比普通对象多一个length字段4 字节┌──────────┬──────────┬────────┐ │Mark Word │Klass Ptr │ length │ │ 8 字节 │ 4 字节 │ 4 字节 │ └──────────┴──────────┴────────┘ 总计8 4 4 16 字节一个元素都没有也占 16 字节——对象头和长度字段省不了。六、自己动手验证用 JOL 量一量光听我说你肯定不信自己量JOLJava Object Layout是 OpenJDK 出的测量工具dependencygroupIdorg.openjdk.jol/groupIdartifactIdjol-core/artifactIdversion0.17/version/dependencyimportorg.openjdk.jol.info.ClassLayout;ObjectobjnewObject();System.out.println(ClassLayout.parseInstance(obj).toPrintable());输出java.lang.Object object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x0000000000000001 8 4 (object header: class) 0x00001000 12 4 (object alignment/padding) Instance size: 16 bytes12 字节有效数据 4 字节对齐 16 字节和我们分析的完全一致。七、回到全貌一张图记住对象 对象头 实例数据 对齐填充 对象头 Mark Word Klass Pointer 数组长度 │ │ │ └─ 4字节压缩/ 8字节不压缩 └─ 固定 8 字节 实例数据 你的字段JVM 可能重排序 对齐填充 凑到 8 的倍数 空 Object 8 4 0 4 16 字节 空 int[] 8 4 4 0 16 字节八、回答技巧与点评标准回答64 位 JVM 默认配置下一个空的 Object 对象占 16 字节。其中 Mark Word 占 8 字节存储哈希码、GC 分代年龄、锁状态等运行时信息Klass Pointer 占 4 字节指针压缩开启指向类元数据实例数据 0 字节对齐填充 4 字节凑到 8 的倍数。加分回答如果你能接着说出以下几点面试官会眼前一亮提到指针压缩默认开启 Compressed OopsKlass Pointer 是 4 字节而不是 8 字节条件是堆内存小于 32GB提到对齐原因8 字节对齐是为了配合 CPU 缓存行读取避免字段跨缓存行导致二次读取同时为指针压缩提供基础地址低 3 位恒为 0提到验证方式用 JOL 工具可以直接打印对象内存布局自己跑一遍比背答案靠谱面试官点评这道题考察的不是你背没背 16 这个数字而是看你是否理解对象的内存结构。能说出 Mark Word 和 Klass Pointer 的人不少但能说清为什么是 4 字节而不是 8 字节指针压缩、为什么需要对齐的人就不多了。如果你还能提到 JOL 工具验证说明你真的是动手验证过不是死记硬背的——这在面试中是非常加分的。原文阅读内容有帮助点赞、收藏、关注三连评论区等你