对象的内部结构

在HotSpot 虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头( Header )、实例数据(Instance Data )和对齐填充( Padding )。

对象头

Mark Word(标记字段)

包含一些用于垃圾回收和同步的标志位,例如对象是否被锁定、对象的哈希码、分代收集信息(新老代)等。

例如在32位的HotSpot虚拟机中,如对象未被同步锁锁定的状态下,Mark Word的32个比特存储空间中的25个比特用于存储对象哈希码,4个比特用于存储对象分代年龄,2个比特用于存储锁标志位,1个比特固定为0,在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如表所示。

类型指针(Class Pointer)

指向对象的类元数据,用于确定对象的类型信息。这个指针帮助 JVM 确定对象是哪个类的实例。

数组长度(Array Length)

仅对数组对象有效,用于存储数组的长度。因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小。

实例数据(Instance Data)

是对象真正存储的有效信息,对象的字段值存储在这部分。字段的数量和类型取决于对象所属的类。实际数据可以包含以下内容:

  • 对象引用: 如果一个字段是对象引用,实际数据部分会存储指向另一个对象的引用。

  • 基本数据类型: 如果一个字段是基本数据类型(如 int、float、double 等),实际数据部分会存储相应的数值。

对齐填充**(Padding)**

由于 JVM 对象的内存布局要求是按照字节对齐的,因此可能存在一些填充数据以保证对象的大小是某个特定字节数的整数倍。

相关推荐
2401_882273721 小时前
golang如何处理zip压缩包_golang zip压缩包处理思路
jvm·数据库·python
tjc199010052 小时前
Golang怎么实现分布式定时任务_Golang如何保证集群中定时任务不重复执行【进阶】
jvm·数据库·python
2301_773553622 小时前
构建 Go CLI 应用的最佳实践:纯 Go 交互式命令行库选型与使用指南
jvm·数据库·python
qq_372906932 小时前
c#如何添加按钮点击事件_c#添加按钮点击事件的几种常见用法
jvm·数据库·python
2301_817672262 小时前
JavaScript 中高效定位二维数组间不匹配元素的行列索引
jvm·数据库·python
2401_831419442 小时前
golang如何实现验证码图片生成_golang验证码图片生成实现实战
jvm·数据库·python
TO_ZRG2 小时前
Android Content Provider 基础
android·jvm·oracle
LiAo_1996_Y2 小时前
CSS实现多列等高布局_浮动布局的高级处理技巧
jvm·数据库·python
HHHHH1010HHHHH2 小时前
HTML函数在笔记本上卡顿怎么办_笔记本运行HTML函数优化操作【操作】
jvm·数据库·python
djjdjdjdjjdj2 小时前
CSS如何实现元素淡入淡出显示_结合animation与opacity属性
jvm·数据库·python