写点什么

Java 24 减少对象头的大小并节省内存

作者:Ben Evans

  • 2024-12-13
    北京
  • 本文字数:1756 字

    阅读完需:约 6 分钟

Java 24减少对象头的大小并节省内存

JEP450(Compact Object Headers,紧凑对象头)已经成为 JDK 24 的交付目标,并且已合并到了主版本中。


这个目前处于实验阶段的特性通过缩小 HotSpot 中强制对象头的大小来优化堆利用率。这应该会减少整体堆的大小,提高部署密度,并增加数据局部性。


当前的实现情况概述


HotSpot 将所有对象存储在 Java 堆中,Java 堆是进程的“C 堆”的连续区域。在 Java 中始终是通过引用来处理对象,例如:


  1. 引用对象的局部变量包含从 Java 方法的堆栈帧到 Java 堆的指针。

  2. 引用类型的对象字段从一个 Java 堆位置指向另一个位置。


Java 引用的目标地址始终是对象头的开始处(这在当前版本的 HotSpot 中是强制性的)。


每个对象上都有标头(数组还有一个额外的 32 位标头来存储数组的长度)。标记字是前 64 位,用于特定于实例的元数据,即支持以下特性:


  • 垃圾回收——存储对象的年龄(以及可能的转发指针)

  • 哈希码——存储对象的稳定身份哈希码

  • 锁——存储对象的锁 / 监视器


在某些情况下,标记字将被覆盖并被替换为指向更复杂数据结构的指针。这会使紧凑对象头的实现稍微复杂一些。


在标记字之后是类(或 klass)字,用于计算指向此类类型的每个对象所共享的元数据的指针。这用于方法调用、反射、类型检查等。


klass 元数据(或 klass)保存在元空间中,元空间位于 Java 堆之外,但在 JVM 进程的 C 堆之内。由于它们存在于 Java 堆外,因此 klass 不需要 Java 对象头,而且它们与反射中使用的类对象(真正的 Java 对象)不同。


klass 字最初是标头的一个完整机器字,但这在 64 位的架构上是很浪费的,因此引入了一种称为“压缩类指针”的技术。这将类指针编码为 32 位(通过使用缩放和偏移方法),适用于加载小于 4GB 类文件的任何应用程序。


因此,除了极端情况外,64 位版本的 HotSpot 上的非数组对象要支付 96 位的“标头税”。相比之下,这是轻量级的:直到最近,Python 的标头税还是 308 字节,但 JEP 450 的目的是为了做得更好,将标头的总大小减少到 64 位。


引入紧凑对象头


这个新实现是作为 OpenJDK 的“Project Lilliput”的一部分开发的,它减少了两个目标 64 位平台(x64 和 AArch64)上的对象头大小。


总体目标是:


  • 将目标平台上的吞吐量和延迟开销限制在 5% 内,并且只有在极少数情况下才能达到这一限制

  • 不会在非目标平台上引入可测量到的吞吐量或延迟开销


事实上,目前的测试只显示了极少数的回归(JDK 24 正在对它们进行修复)。到目前为止,亚马逊(Amazon)的测试表明,许多工作负载实际上在吞吐量方面受益,有时甚至会有大幅提升——一些工作负载的 CPU 利用率下降了 30%。


该项目试图利用观察到的事实,即许多 Java 工作负载的平均对象大小较小,只有 32 到 64 字节。这相当于约 20% 的标头税。因此,即使对象头大小略有改进,也可以显著减少堆的占用空间。反过来,这可以提高数据局部性并减少 GC 压力,从而带来进一步的潜在性能优势。


为了实现这种标头的减小,标记字和类字被组合成一个 64 位字,布局如下:



我们应该注意到以下几个方面:


  1. 现在有 22 位(而不是 32 位)用于标识对象类类型。这意味着我们可以加载到 JVM 进程中的不同类类型的数量约为 400 万个。

  2. 哈希码的大小不会变。

  3. 锁定操作不再覆盖标记字。这将保留压缩的类指针。

  4. 为了保持对压缩类指针的直接访问,GC 转发操作变得更加复杂。

  5. 有 4 个未使用的位保留用于未来的增强(例如 Valhalla 项目)


如果 Java 锁存在争用,那么新的实现需要查找保存锁信息的 辅助数据结 构的地址。这种方法称为“对象监视表”,已经在 JDK 22 中实现了,并由默认启用的新开关 UseObjectMonitorTable 激活。紧凑对象头依赖于此机制。


如果没有发现任何阻碍问题,这一特性将作为 JDK 24 的一部分发布(最初是一个实验特性),发布时间预计在 2025 年 3 月。长期的目标是使该机制成为受支持平台上唯一的标头表示,但这可能需要更多的版本。它还取决于对实际工作负载的广泛测试,目前缺乏性能和其他回归。甚至还有正在进行的探索性工作,以查看是否有可能将标头大小减小到 32 位。


一旦该特性在 JDK 24(测试版或最终版)中可用,应用程序团队可以通过命令行开关 -XX:UseCompactObjectHeaders 来激活该新特性以测试他们的工作负载,并寻找与之相关的性能差异,从而为长期目标提供帮助。


原文链接:

https://www.infoq.com/news/2024/11/compact-headers-java24/

2024-12-13 08:008754

评论

发布
暂无评论
发现更多内容

智能网络感知,打造极致流畅的鸿蒙版中国移动云盘图文体验

最新动态

MySQL 优化利器 SHOW PROFILE 的实现原理

不在线第一只蜗牛

MySQL 数据库

全民豪车时代,享界S9增程版靠什么“一鼎定乾坤”?

脑极体

AI

Spring Boot 集成实战:AI 工具如何自动生成完整微服务模块

飞算JavaAI开发助手

HarmonyOS:动画 motionPath 、 animateToImmediately API自学指南

李游Leo

HarmonyOS

Flink + Doris 实时湖仓解决方案

Apache Flink

大数据 flink 实时计算 Doris

鸿蒙摄像机,一场智能安防的“平权革命”

脑极体

AI

平安证券 NoETL 指标平台实践:统一数据口径,驱动高效经营分析与智能决策

Aloudata

数据仓库 数据分析 大模型 指标平台 万数皆可问

数据无界、湖仓无界,Apache Doris 湖仓一体典型场景实战指南(下篇)

SelectDB

数据湖 Doris LakeHouse trino 湖仓一体

2025年企业组网新趋势:SASE与SD-WAN发展解析

Ogcloud

SD-WAN 组网 企业组网 企业网络 SD-WAN服务商

等保测评取消打分《网络安全等级测评报告模版(2025版)》变更

黑龙江陆陆信息测评部

HarmonyOS @Reusable 装饰器自学指南:高性能组件复用实战指南

李游Leo

@Reusable

全民豪车时代,享界S9增程版靠什么“一鼎定乾坤”?

脑洞汽车

AI

HarmonyOS:动画 motionPath 、 animateToImmediately API自学指南

李游Leo

HarmonyOS

Java 开发高手必备:AI 工具如何帮你快速生成 Spring Boot 配置?

飞算JavaAI开发助手

秒杀系统开发指南:用 AI 工具生成高并发代码的 5 个要点

飞算JavaAI开发助手

外贸人必看!三步用云手机轻松收集产品反馈

Ogcloud

云手机 海外云手机 舆情监控 舆情监测 海外舆情监控

SvelteKit 最新中文文档教程(12)—— 高级路由

冴羽

React Svelte SvelteKit

项目管理系统(源码+讲解+演示)

深圳亥时科技

镜舟科技荣膺“北京市用户满意企业”认证,以用户为中心驱动高质量发展

镜舟科技

数据 技术创新 LakeHouse StarRocks 镜舟科技

关于 K8s 的一些基础概念整理-补充

不在线第一只蜗牛

Docker Kubernetes

“清华”天才们联合创立,这家具身智能领域创企完成2亿元天使轮融资!

机器人头条

科技 大模型 人形机器人 具身智能

2.5D封装为何成为AI芯片的“宠儿”?

E科讯

昆仑万维发布 Mureka TTS API 和音乐推理大模型;通义发布小尺寸端到端多模态模型 Qwen2.5-Omni丨日报

声网

湖北文旅智能化财务共享中心正式上线,树立文旅行业数字化转型新标杆

用友智能财务

财务 会计

《深入理解 eBPF 与可观测性》正式上架,龙蜥多位资深专家倾力打造

OpenAnolis小助手

Linux 操作系统 龙蜥社区 eBPF 技术

淘宝商品详情 API 接口全解析:从接入到实战

tbapi

淘宝商品详情接口 淘宝API 淘宝商品数据采集

远程控制软件套路深?4款对比测评,只有贝锐向日葵最靠谱!

科技热闻

云学堂更名绚星智慧科技:发布AI新战略 领航企业智能生产力时代

人称T客

怎么用DeepSeek生成甘特图?DS高阶使用技巧分享!

职场工具箱

甘特图 在线白板 AIGC AI 绘图 DeepSeek

HarmonyOS:ArkTS 显式动画 animateTo 自学指南

李游Leo

HarmonyOS

Java 24减少对象头的大小并节省内存_编程语言_InfoQ精选文章