对象的内存布局
对象的内存布局
在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三个部分:对象头Header、实例数据Instance Data和对齐填充Padding
对象头
HotSpot虚拟机的对象头有两类信息:
对象自身的运行时数据
类型指针
-
对象自身的运行时数据:
-
哈希码、GC分代信息、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等
-
在32位和64位的虚拟机中分别位32比特和64比特,官方称为“Mark Word”
-
-
Mark Word被设计成有着动态定义的数据结构,以便在极小的空间内存储尽量多的数据,根据对象的状态复用自己的存储空间
-
类型指针
-
即对象指向它的类型元数据的指针,java虚拟机通过这个指针确定该对象是哪个类的实例,确定java对象的大小
-
如果是数组,在对象头中还需要存储记录数组长度的数据
-
实例数据
实例数据部分是对象真正存储的有效信息,即在程序代码中定义的各种类型字段内容。包括从父类继承的。
-
存储顺序受到虚拟机分配策略参数:-XX:FieldsAllocationStyle和字段在java源码中定义顺序的影响。
-
HotSpot虚拟机的默认分配顺序是:longs/double、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers);
-
相同宽度的字段总是被分配到一起存放,满足这个的前提下,在父类中定义的变量会出现在子类之前;
-
如果HotSpot虚拟机的-XX:CompactFields参数是true,那子类中较窄的变量也允许插入父类变量的空隙,以节省空间。
-
对齐填充
这并不是必然存在的,仅仅起着占位符的作用;
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!