当前位置: 首页 > news >正文

Java对象内存结构详解

Java对象内存结构详解

Java对象在JVM内存中的存储结构可以分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。以下是64位JVM(开启压缩指针)下的典型布局:
在这里插入图片描述

1. 对象头(Header)

对象头包含运行时元数据和控制信息,占12字节(压缩指针)或16字节(未压缩)

(1) Mark Word(8字节)

存储对象自身的运行时数据,内容会随锁状态变化:

锁状态存储内容
无锁哈希码(31bit) + 分代年龄(4bit) + 偏向模式(1bit) + 锁标志(2bit)
偏向锁线程ID(54bit) + Epoch(2bit) + 分代年龄(4bit) + 偏向模式(1bit) + 锁标志(2bit)
轻量级锁指向栈中锁记录的指针(62bit) + 锁标志(2bit)
重量级锁指向监视器(Monitor)的指针(62bit) + 锁标志(2bit)
GC标记空(用于垃圾回收标记)

(2) Klass Pointer(4字节)

指向方法区中的类元数据的指针(开启压缩指针时为4字节,否则8字节)

(3) 数组长度(可选,4字节)

如果是数组对象,额外存储数组长度

2. 实例数据(Instance Data)

存储对象真正的有效信息,即各个字段的内容,排列顺序受以下规则影响:

  1. 基本类型优先(long/double → int/float → short/char → byte/boolean)
  2. 相同宽度字段放在一起
  3. 父类字段在子类之前

字段内存占用

类型大小
boolean1字节
byte1字节
short2字节
char2字节
int4字节
float4字节
long8字节
double8字节
引用类型4字节(压缩指针)或8字节

示例:

class MyObject {
    byte b;      // 1字节
    int i;       // 4字节
    long l;      // 8字节
    Object ref;  // 4字节(压缩指针)
}
// 实例数据总大小 = 1 + 4 + 8 + 4 = 17字节

3. 对齐填充(Padding)

JVM要求对象起始地址必须是8字节的整数倍,因此可能需要填充字节(0-7字节)

示例计算

对象头:12字节 (MarkWord 8 + KlassPointer 4)
实例数据:17字节
总计:12 + 17 = 29字节
需要填充到32字节(8的倍数)
最终对象大小:32字节

4. 完整对象内存布局示例

[对象头]
  [Mark Word(8字节)] 0x00000001d83eb950
  [Klass Pointer(4字节)] 0x0000000100000000
  [数组长度(4字节)] 0x00000005 (仅数组对象有)
[实例数据]
  [int id(4字节)] 0x00000001
  [String name(4字节)] 0x000000076bdc8c18
  [double price(8字节)] 0x4024000000000000
[对齐填充(4字节)] 0x00000000

5. 查看对象内存布局的方法

(1) 使用JOL工具

// 添加依赖
<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.16</version>
</dependency>

// 打印对象布局
System.out.println(ClassLayout.parseInstance(obj).toPrintable());

(2) 示例输出

class com.example.MyObject object internals:
OFF  SZ               TYPE DESCRIPTION               VALUE
  0   8                    (object header: mark)     0x00000001d83eb950
  8   4                    (object header: class)    0x0000000100000000
 12   4                int MyObject.id               1
 16   8             double MyObject.price            10.0
 24   4   java.lang.String MyObject.name             "test"
 28   4                    (object alignment gap)    
Instance size: 32 bytes

6. 对象结构优化技巧

  1. 字段重排序:手动排列字段可减少填充

    // 优化前:需要4字节填充
    class Bad {
        byte b;
        long l;
        int i;
    }
    // 优化后:无填充
    class Good {
        long l;
        int i;
        byte b;
    }
    
  2. 使用基本类型:避免包装类(Integer等)的内存开销

  3. 对象共享:对于不变对象可复用(如String池)

资料免费获取

相关文章:

  • 文献总结:AAAI2025-UniV2X-End-to-end autonomous driving through V2X cooperation
  • linux RCU技术
  • Android11车载WiFi热点默认名称及密码配置
  • 蓝桥杯嵌入式考前模块总结
  • CMake中add_custom_command用法详解
  • Kubernetes安装与集群构建详细过程
  • 【STM32标准库】--新建工程
  • redis之缓存击穿
  • JavaScript Symbol与BigInt
  • Vue.js组件安全工程化演进:从防御体系构建到安全性能融合
  • 计算机系统设计中的一些常用方法
  • 《MATLAB实战训练营:从入门到工业级应用》趣味入门篇-用MATLAB画一朵会动的3D玫瑰:从零开始的浪漫编程之旅
  • 打造海外流量矩阵,TikTok云控工具让获客更简单!
  • SpringBoot企业级开发之【用户模块-更新用户头像】
  • 1、从零搭建魔法工坊:React 19 新手村生存指南
  • ai软件UI自动化
  • 解锁语言学习新宝藏:Forvo 网站深度探秘​
  • 【Zabbix7.2修改网页logo和系统名称的方法】
  • 软件信息化项目等级分类评定表
  • Amazon Bedrock Agents:企业 AI 应用开发的革新力量
  • 网站开发进入腾信职位/如何做电商赚钱
  • 莆田市秀屿区建设局网站/百度搜索排行榜
  • 中小微企业查询官网/温州seo外包公司
  • 建了个网站百度上会有么/国家免费培训网站
  • java开发游戏/谷歌seo是做什么的
  • 微信网站后期运营怎么做/营销策划咨询机构