Java对象内存结构由对象头、实例数据和对齐填充三部分组成。①对象头含Mark Word(64位下8字节,可压缩为4字节)和类指针(默认8字节,开启指针压缩后4字节),数组对象额外4字节存长度;②实例数据存储字段,按类型宽度分组排列,父类字段在前,子类在后,引用类型在64位JVM中占4或8字节;③对齐填充确保总大小为8字节倍数,不足时补全。例如64位JVM中一个含int和引用的普通对象:对象头12字节+实例数据8字节=20字节,填充至24字节。理解该结构有助于精确计算对象大小、优化内存使用及深入掌握锁机制等底层原理。

Java对象在内存中的结构主要由三部分组成:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。这部分内容对于理解JVM内存管理、对象大小计算以及性能调优都有重要意义。
对象头(Object Header)
每个Java对象在堆中都包含一个对象头,它存储了对象的元信息,主要包括:
Mark Word:用于存储对象的运行时状态信息,如哈希码、GC分代年龄、锁状态标志、线程持有的锁等。在32位JVM中占4字节,64位JVM中通常占8字节(可开启指针压缩压缩为4字节)。 Class Pointer:指向其类元数据的指针,JVM通过它确定对象是哪个类的实例。默认情况下64位JVM占8字节,开启-XX:+UseCompressedOops后压缩为4字节。 数组长度(仅数组对象):如果对象是数组类型,对象头还会额外包含4字节记录数组长度。
实例数据(Instance Data)
这部分存储对象的实际字段内容,包括从父类继承下来的和本类定义的所有实例变量。存储顺序受JVM内存分配策略和字段声明顺序影响,通常遵循以下规则:
相同宽度的字段会被分配到一起(如int与int相邻)。 默认分配顺序为:long/double → int → short/char → byte/boolean → reference(引用)。 父类字段会出现在子类字段之前。
开启-XX:+CompactFields时,JVM可能会重排字段以减少内存占用。
立即学习“Java免费学习笔记(深入)”;
MyBatis3.2.3帮助文档 中文CHM版
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录。有需要的朋友可以下载看看
1 查看详情
对齐填充(Padding)
JVM要求对象的总大小必须是8字节的倍数(64位平台),这是为了内存对齐,提升访问效率。当对象头加实例数据的总大小不是8的倍数时,JVM会自动填充剩余字节。
例如,若对象实际占用18字节,则填充至24字节;若为16字节则无需填充。
举个例子:在64位JVM中,一个普通非数组对象,无父类,包含一个int字段和一个引用字段(开启指针压缩),其内存布局如下:
对象头:Mark Word(8字节) + Class Pointer(4字节) = 12字节 实例数据:int(4字节) + 引用(4字节) = 8字节 总大小:20字节 → 填充至24字节(8的倍数)
基本上就这些。了解对象内存布局有助于分析对象大小、排查内存浪费问题,也能帮助理解同步机制背后的实现原理。不复杂但容易忽略。
以上就是Java对象在内存中的结构的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1100833.html
微信扫一扫
支付宝扫一扫