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

Java对象头(Object Header)

Java对象在内存中的布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)

1. 对象头组成

1.1 Mark Word(标记字段)

存储对象的运行时数据,包括:

  • 哈希码(HashCode)

  • GC分代年龄(4位,所以最大年龄15)

  • 锁状态标志(无锁、偏向锁、轻量级锁、重量级锁、GC标记)

  • 线程持有的锁偏向线程ID偏向时间戳

1.2 Klass Pointer(类型指针)

指向方法区中对象的类元数据(Class Metadata),JVM通过这个指针确定对象属于哪个类。

1.3 数组长度(仅数组对象有)

如果对象是数组,还需要记录数组的长度。

2. 不同架构下的对象头大小

32位JVM:

| Mark Word (32bits) | Klass Pointer (32bits) | [数组长度 (32bits)] | | 4字节 | 4字节 | 4字节(仅数组) |

64位JVM(未开启指针压缩):

| Mark Word (64bits) | Klass Pointer (64bits) | [数组长度 (32bits)] | | 8字节 | 8字节 | 4字节(仅数组) |

64位JVM(开启指针压缩 -XX:+UseCompressedOops,默认开启):

| Mark Word (64bits) | Klass Pointer (32bits) | [数组长度 (32bits)] | | 8字节 | 4字节 | 4字节(仅数组) |

3. Mark Word的具体结构

32位JVM的Mark Word布局:

|----------------------------------------------------------------------| | Mark Word (32 bits) | |----------------------------------------------------------------------| | identity_hashcode:25 | age:4 | biased_lock:1 | lock:2 | state:00 | 无锁 | thread:23 | epoch:2 | age:4 | biased_lock:1 | lock:2 | state:01 | 偏向锁 | ptr_to_lock_record:30 | state:00 | 轻量级锁 | ptr_to_heavyweight_monitor:30 | state:10 | 重量级锁 | |11 | GC标记 |----------------------------------------------------------------------|

64位JVM的Mark Word布局:

|------------------------------------------------------------------------------| | Mark Word (64 bits) | |------------------------------------------------------------------------------| | unused:25 | identity_hashcode:31 | unused:1 | age:4 | biased_lock:1 | lock:2 | 无锁 | thread:54 | epoch:2 | unused:1 | age:4 | biased_lock:1 | lock:2 | 偏向锁 | ptr_to_lock_record:62 | lock:2 | 轻量级锁 | ptr_to_heavyweight_monitor:62 | lock:2 | 重量级锁 | | lock:2 | GC标记 |------------------------------------------------------------------------------|

4. 锁状态在对象头中的表示

锁状态通过最后2-3位表示:

  • 01:无锁/偏向锁(通过biased_lock位区分)

    • 001:无锁

    • 101:偏向锁

  • 00:轻量级锁

  • 10:重量级锁

  • 11:GC标记

5. 代码示例:查看对象头

import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.vm.VM; public class ObjectHeaderDemo { public static void main(String[] args) { // 打印JVM详情 System.out.println(VM.current().details()); // 创建对象 Object obj = new Object(); // 查看对象布局 System.out.println("======= Object对象布局 ======="); System.out.println(ClassLayout.parseInstance(obj).toPrintable()); // 数组对象 int[] array = new int[3]; System.out.println("======= 数组对象布局 ======="); System.out.println(ClassLayout.parseInstance(array).toPrintable()); // 自定义对象 User user = new User(); System.out.println("======= 自定义对象布局 ======="); System.out.println(ClassLayout.parseInstance(user).toPrintable()); } static class User { private int id; private String name; private boolean active; } }

6. 示例输出(简化版)

# 64位JVM,开启指针压缩 java.lang.Object object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) # Mark Word前半部分 01 00 00 00 4 4 (object header) # Mark Word后半部分 00 00 00 00 8 4 (object header) # Klass Pointer e5 01 00 f8 12 4 (loss due to the next object alignment) # 对齐填充 Instance size: 16 bytes

7. 重要概念

7.1 指针压缩(Compressed Oops)

  • 默认开启,将64位指针压缩为32位

  • 可节省内存,提高缓存命中率

  • 对象地址对齐到8字节倍数

7.2 对象对齐

  • 对象总大小必须是8字节的倍数

  • 不足部分用对齐填充补齐

7.3 对象头的实际使用

// 查看对象的hashCode(存储在对象头中) Object obj = new Object(); int hashCode = obj.hashCode(); // 从对象头获取 // synchronized使用对象头中的锁信息 synchronized(obj) { // 锁信息记录在对象头中 }

8. 工具

  • JOL(Java Object Layout):OpenJDK提供的对象布局分析工具

<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.16</version> </dependency>

总结

Java对象头是理解Java对象内存布局、锁机制、GC机制的基础。不同的JVM实现可能有细微差异,但基本结构相似。通过理解对象头,可以更好地优化内存使用和理解并发机制。

http://www.jsqmd.com/news/166338/

相关文章:

  • PyTorch DataLoader性能瓶颈排查:从Miniconda环境入手
  • 2025年AI行业热点:应用层核心技术人才年薪破百万,字节跳动、腾讯等巨头争相布局黄金赛道!
  • PyTorch Geometric等扩展库在Miniconda-Python3.9中的安装方法
  • PyTorch自定义算子开发环境搭建:Miniconda-Python3.9指南
  • 「地质约束显式+数据驱动模型」的新路径,浙江大学团队实现跨区域矿产远景预测性能和可解释性提升
  • PyTorch批处理任务调度:Miniconda-Python3.9环境自动化脚本
  • Miniconda-Python3.9结合Markdown编写可执行AI技术文档
  • PyTorch QoS保障机制:基于Miniconda-Python3.9环境实现
  • 2025年AI领域全景观察:从大模型突破到Agent架构,开发者必读的技术趋势指南!
  • PyTorch模型微调任务的最佳Miniconda-Python3.9配置方案
  • 收藏!大模型入门避坑指南:小白/程序员专属学习路径+全套资源清单
  • PyTorch实验日志记录系统搭建:Miniconda-Python3.9基础环境
  • 从Manus被Meta收购看AI创业浪潮,普通程序员如何抓住大模型时代红利?
  • Miniconda-Python3.9环境下实现PyTorch模型差分隐私训练
  • PyTorch模型剪枝与蒸馏实验环境:Miniconda-Python3.9搭建
  • 吃透可编程控制器,可编程控制器基本知识介绍
  • 从运营到AI产品经理:3个月自学转型之路,揭秘原型图、数据分析与AI理论三大技能的学习路径!
  • PyTorch概念漂移适应机制:Miniconda-Python3.9环境实验
  • PyTorch模型注册中心对接:Miniconda-Python3.9环境准备
  • 收藏!一文理清LangChain、LangGraph与DeepAgents:AI智能体开发三层体系拆解
  • PyTorch自动微分机制验证:Miniconda-Python3.9环境实操
  • Miniconda-Python3.9是否支持PyTorch 2.x最新特性体验?
  • PyTorch异步推理任务处理:Miniconda-Python3.9环境队列设计
  • 揭秘背后真相:为何大厂都在秘密布局AI Agent?普通人如何以低成本加入这场科技革命
  • 大湾区创业者社群推荐:选对圈子,让创业少走弯路 - 黑马榜单
  • Miniconda-Python3.9环境下使用PyTorch进行张量运算测试
  • Miniconda-Python3.9环境下验证PyTorch是否成功启用GPU
  • Spring 中的依赖注入与数据源对象管理详解(基于黑马ssm网课课程总结)
  • SpringBoot代码集
  • Qt QPointer 快速入门