深入理解 Java 对象的内存布局

对于 Java 虚拟机,都知道其内存区域划分成:堆、方法区、虚拟机栈等区域。但一个对象在 Java 虚拟机中是怎样存储的,相信很少人会比较清楚地了解。Java 对象在 JVM 中的内存布局,是了解并发编程同步机制的基础。

在 HotSpot 虚拟机中,对象在内存中存储的布局可以分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

对象头

HotSpot 虚拟机的对象头包括两部分信息,第一部分用于存储自身运行时的数据,第二部分用于存储类型指针。

自身运行时数据

对象头第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。这部分数据的长度在 32 位和 64 位的虚拟机中分别为 32bit 和 64bit,官方称它为「Mark Word」。

为了提高虚拟机的空间效率,Mark Word 被设计成非固定的数据结构,从而可以在不同状态时存储不同的数据,从而达到节省数据空间的目的。Mark Word 在不同状态下存储的内容如下表格所示。

状态 标识位 存储内容
未锁定 01 对象哈希码,对象分代年龄
轻量级锁 00 指向锁记录的指针
膨胀(重量级锁) 10 指向重量级锁的指针
GC标记 11 空,不需要记录信息
可偏向 01 偏性线程ID,偏向时间戳,对象分代年龄

Java 对象的内存布局

如上表所示,在 32 位的 HotSpot 虚拟机中,如果对象处于未被锁定(标志位为 01)的状态下,那么 Mark Word 存储的就是「对象哈希码、对象分代年龄」。32bit 空间中的 25bit 用于存储对象哈希码,4bit 用于存储对象分代年龄,2bit 用于存储锁标志位,1bit 固定为 0。

类型指针

对象头第二部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。 另外,如果对象是一个 Java 数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通 Java 对象的元数据信息确定 Java 对象的大小,但是从数组的元数据中却无法确定数组的大小。

实例数据

实例数据部分是对象真正存储的有效信息,包括了程序里各个类型的字段类型,无论是父类继承下来的,还是子类中定义的。一般来说,父类定义的变量总会出现在子类之前。

对齐填充

对象填充部分并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于 HotSpot VM 的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍,换句话说,就是对象的大小必须是 8 字节的整数倍。而对象头部分正好是 8 字节的倍数(1 倍或者 2 倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

总结

介绍了 Java 对象在 JVM 中的内存布局,整体可以分为:对象头、实例数据、对齐填充三个部分。

第一部分的对象头包括了对象运行时数据和类型指针。其中对象运行时数据包括:哈希码、GC 分代年龄、锁状态标志等,类型指针指向对象类型元数据,确定对象是哪个类的实例。

第二部分是实例数据,是真正存储的有效信息,包括各个类型的字段。第三部分是对齐填充,因为 JVM 要求对象起始地址必须是 8 字节的整数倍,所以必须有对齐填充来占位。

相关推荐
AC赳赳老秦20 小时前
网安工程师提效:用 OpenClaw 实现漏洞扫描报告生成、安全巡检自动化、日志合规审计
java·开发语言·前端·javascript·python·deepseek·openclaw
ffqws_20 小时前
MyBatis 动态 SQL 详解:从原理到实战
java·sql·mybatis
浮尘笔记20 小时前
在Snowy后台无需编码实现自动化生成CRUD操作流程
java·开发语言·经验分享·spring boot·后端·程序人生·mybatis
-星空下无敌21 小时前
IDEA 2025.3.1最新最全下载、安装、配置及使用教程(保姆级教程)
java·ide·intellij-idea
JAVA面经实录91721 小时前
Spring Boot + Spring AI 一体化实战全文档
java·人工智能·spring boot·spring
希望永不加班21 小时前
SpringBoot 接口签名验证(AppKey/Secret)
java·spring boot·后端·spring
fengxin_rou21 小时前
RabbitMQ安装教程:windows本地安装和docker部署
java·分布式·后端·rabbitmq
a8a30221 小时前
Laravel7.x核心特性全解析
java·spring boot·后端
AI人工智能+电脑小能手21 小时前
【大白话说Java面试题】【Java基础篇】第19题:HashMap的key如何减少发生哈希冲突
java·开发语言·后端·面试·哈希算法·hash-index·hash
coderlin_21 小时前
Langgraph项目三 agent搭建
java·数据库·redis