JAVA对象内存布局

news/2025/10/15 18:57:46/文章来源:https://www.cnblogs.com/tianzhentian/p/19144054

🔴 Java对象在堆内存中的存储布局分为三个主要部分:对象头(Object Header)、实例数据(Instance Data)、对齐填充(Padding)。对象头是理解synchronized锁机制的关键。


🔴 对象内存布局三大结构

🔴 1. 对象头 (Object Header)

🔴 对象头是Java对象内存布局的第一部分,包含对象的元数据信息,是synchronized锁机制实现的基础。

🔴 1.1 Mark Word (标记字段)

  • 🔴 锁状态标记:无锁、偏向锁、轻量级锁、重量级锁
  • 🔴 HashCode:对象的哈希码
  • 🔴 GC分代年龄:垃圾回收分代信息
  • 🔴 偏向锁线程ID:偏向锁的线程标识
  • 🔴 偏向时间戳:偏向锁的时间信息

🟠 1.2 类型指针 (Class Pointer)

  • 🟠 指向方法区:指向方法区中类的元数据
  • 🟠 类型检查:instanceof操作的基础
🟠 指针压缩 (Compressed Oops)
  • 🟠 压缩原理:64位指针压缩为32位,减少内存占用
  • 🟠 地址对齐:对象地址8字节对齐,后3位总是0
  • 🟠 压缩过程:存储时右移3位去掉0,访问时左移3位恢复
  • 🟠 适用范围:堆内存≤32GB时有效,>32GB时自动失效
  • 🟠 JVM参数-XX:+UseCompressedOops(默认开启)
🟡 句柄池 vs 直接指针
  • 🟡 句柄池 (Handle Pool)
    • 对象引用指向句柄池中的句柄,句柄再指向实际对象
    • 优点:对象移动时只需更新句柄,引用地址不变
    • 缺点:多一次间接访问,性能开销较大
  • 🟡 直接指针 (Direct Pointer)
    • 对象引用直接指向对象在堆中的地址
    • 优点:访问速度快,减少间接寻址开销
    • 缺点:对象移动时需要更新所有引用
  • 🟡 HotSpot选择:使用直接指针,通过其他技术解决对象移动问题

🟢 1.3 数组长度 (Array Length)

  • 🟢 仅数组对象:只有数组对象才有此字段
  • 🟢 长度信息:存储数组的长度

🟢 1.4 字节序存储 (Endianness)

  • 🟢 大端存储 (Big Endian):高位字节存储在低地址
  • 🟢 小端存储 (Little Endian):低位字节存储在低地址
  • JVM实现:对象内存存储遵循硬件架构,但ByteBuffer等I/O操作默认使用大端存储

🔴 2. 实例数据 (Instance Data)

🔴 实例数据存储对象的实际字段值,是对象的核心数据部分。

🟢 字段存储规则

🟢 1. 字段重排序规则
  • 🟢 按类型大小排序:字段按字节数从大到小排列
    • 8字节:long、double
    • 4字节:int、float
    • 2字节:short、char
    • 1字节:byte、boolean
  • 🟢 引用类型后置:引用类型字段排在基本类型之后
  • 🟢 父类字段在前:父类字段在子类字段之前
  • 🟡 声明顺序保持:同类型字段保持声明顺序
🔴 2. FieldsAllocationStyle 策略
  • 🔴 策略0:基本类型 → 填充字段 → 引用类型
    • 比较“机械”的方式,不考虑类型分组或继承
    • 常见于早期JVM
  • 🔴 策略1:引用类型 → 基本类型 → 填充字段
    • 把所有引用类型字段靠前放,优化对象访问的引用局部性
  • 🔴 策略2:混合策略(默认)
    • 父类部分按策略0排列
    • 子类部分按策略1排列
    • 将父类与子类的引用类型尽量放在一起
    • 优点:考虑继承结构,减少内存碎片、提高缓存利用率、加快GC的效率
  • 🟡 JVM参数-XX:FieldsAllocationStyle=0/1/2
  • 🟡 简单总结:策略0=简单顺序,策略1=引用优先,策略2=继承优化混合排序(默认)
🔴 字段插入面试问题

高频面试题:

  • Q:当父类和子类都有实例字段时,子类的字段会不会插入到父类的字段布局空隙里?
    • A:不会。
    • HotSpot在分配对象布局时,父类和子类的实例字段是独立布局区域,父类部分结束后才开始子类字段。
    • 即使父类有未使用的填充字节,子类也不会去“填补”。
    • 布局原则:父类字段区域 → 子类字段区域(独立布局)。
    • 优化范围:字段插入优化仅在同一层级内生效(父类内部或子类内部)。

中频延伸:

  • Q:FieldsAllocationStyle策略2的混合优化体现在哪里?
    • 父类部分按策略0排列(基本类型 → 填充字段 → 引用类型)
    • 子类部分按策略1排列(引用类型 → 基本类型 → 填充字段)
    • 将父类与子类的引用类型尽量放在一起(但不会跨区域插入字段)

低频问法:

  • Q:为什么JVM不允许子类字段利用父类的填充空间?
    • 保持父类字段偏移的稳定性(反射、Unsafe、JIT 优化依赖)
    • 避免类加载隔离问题(父类可能独立加载或共享)
    • 设计权衡:牺牲少量内存,换取更好性能与可预测性
🟠 3. 内存对齐优化
  • 🟠 减少填充:通过字段重排序减少内存浪费
  • 🟠 提高缓存命中率:优化内存访问效率
  • 🟠 CPU友好:减少CPU访问开销
  • JVM自动处理:开发者无需手动干预

🟠 3. 对齐填充 (Padding)

🟠 对齐填充是为了满足JVM内存对齐要求而添加的空白字节。

🟠 对齐原因

  • 🟠 8字节对齐:JVM要求对象大小必须是8字节的倍数
  • 🟠 性能优化:内存对齐提高CPU访问效率
  • 🟡 内存浪费:可能造成少量内存浪费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20232409 2025-2026-1 《网络与系统攻防技术》实验二实验报告

后门原理与实践 1.实验内容1.1 Netcat的基本应用;1.2 Socat基本应用;1.3 Meterpreter基本应用。2.实验目的学习Netcat、Socat、Meterpreter生成、投放、自启动技术,使用以上后门并远程控制另一主机,获取目标主机音…

10月15号

今天上午,进行了离散数学和马克思思想的学习。

记录一次客户现场环境,银河麒麟V10操作系统重启后,进入登录页面后卡死,鼠标键盘无响应的解决过程

银河麒麟V10操作系统重启后,进入登录页面后卡死,鼠标键盘无响应,SSH无法登录的原因是Mysql的自启动服务导致卡死(具体为什么Mysql会卡死操作系统,待查) 现象:第一天用户反应,应用系统无法访问,现场运维查看后…

图 生成树

图为什么会有生成树?图不是顶点和边的集合吗?顶点确定了,边也确定了,这个图不就固定了吗?你提出的这个问题非常好,它触及了图的结构和生成树的核心概念。的确,图是由顶点(节点)和边(连接节点的线)组成的,它…

DolphinScheduler 3.1.9 单机版重启后,项目、流程定义等数据全部丢失

本文将介绍 Apache DolphinScheduler 的 Worker 负载均衡,含加权随机、平滑轮询、线性负载(默认)三种算法,及配置修改、Worker 权重与预热机制,并细述各算法原理。详情可参考文末源文档地址。问题描述 DolphinSch…

ManySpeech.AliParaformerAsr 使用指南

一、简介 ManySpeech 是由 manyeyes 社区开发的一款基于 C# 的语音处理套件。 ManySpeech.AliParaformerAsr 是 ManySpeech 中的“语音识别”组件,支持paraformer-large、paraformer-seaco-large、sensevoice-small 等…

资料拿取表

Day OIer周一 王翔宇、王艺轩周二 宋承珂、段泽成周三 王子豪、焦有泽周四 张梓扬、刘承昊周五 罗超锵、周智翔周六 王紫依、崔岱尧周日 两位幸运观众ps:想修改的直接给我说就行(不能修改成空气) 参考文献 本周幸运观…

易路:以“薪酬科技+AI”重塑中国企业薪酬管理新范式

在数字经济浪潮席卷全球的当下,企业对人力资源管理的需求正从传统事务性操作向战略性赋能加速转型。其中,薪酬管理作为连接企业战略与人才发展的核心纽带,其复杂性与重要性日益凸显。面对这一变革,易路人力资源科技…

2025年太阳能板终极指南:选择、趋势与品牌推荐

文章摘要 本文深入探讨2025年太阳能板的选择方法、未来趋势及品牌推荐,帮助用户做出明智投资决策。内容涵盖效率提升、安装技巧、市场分析,并基于权威数据提供实用建议,旨在推广太阳能板的环保与经济优势。阅读本指…

洛谷题单指南-进阶数论-CF776B Sherlock and his girlfriend

原题链接:https://www.luogu.com.cn/problem/CF776B 题意解读:将2~n+1的数字进行分类,不能和素因子分在一类,分类越少越好 解题思路: 所有素数显然可以分为一类,其余合数为另外一类,只用标记素数即可,埃氏筛解…

Web 编写 22

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

svn 忽略选项还原

svn 忽略选项还原svn 忽略出现问题导致项目新添加的文件无法自动 Add,或其它问题。 解决办法:在项目根目录内空白处,右键弹出菜单选择 properties,然后修改 svn:ignore 和其它正常项目一样即可。桂棹兮兰桨,击空明…

【html】canvas实现一个时钟 - 实践

【html】canvas实现一个时钟 - 实践2025-10-15 18:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

特殊函数

> C语言三大特殊函数:静态函数(缩小可见域)、递归函数(自我调用)、回调函数(钩子/函数指针)。一、静态函数:文件级私有化背景知识: 普通函数都是跨文件可见的,即在文件 a.c 中定义的函数可以在 b.c 中使用…

一行代码也能行?极简实现GPIO按键关机(支持短按/长按)

别被复杂的逻辑吓到!其实用极简代码就能实现GPIO按键的短按与长按识别。本文介绍一种高效、稳定、易懂的实现方式,适合快速集成到你的项目中。 本文将以Air8000核心板为例,分享如何使用GPIO控制预留的POWER_ON按键,…

日总结 12

今天下午体测,由于这周一才通知,加上平常我确实也不太运动,我选择晚上去跑一跑,至少得能坚持下来吧(白天都是满课),事实证明平时不运动确实不好,跑一会儿就开始气喘吁吁的,但晚上跑步也让我看到了平时看不到的…

2025年太阳能板趋势与智能选择指南

文章摘要 本文深入分析2025年太阳能板市场趋势,包括效率提升、成本变化和行业展望,并提供实用选择指南,帮助家庭和工业用户做出明智决策。基于权威数据,我们探讨太阳能板的环保优势、安装维护技巧,以及如何通过性…

JarvisIR

一、第一页 1、现实世界中的恶略天气表现出耦合的退化(雨天、雪天、雾天等等往往还伴随着雨滴、模糊、光晕等)。 2、不良天气图像复原方法主要有三种:任务专用法、一体化方法、整合多种专用模型。 1)任务专用法:针…

10/15

学习了有关统计系统的代码。