写点什么

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:008460

评论

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

SQL CREATE INDEX 语句- 提高数据库检索效率的关键步骤

小万哥

MySQL 数据库 sql 程序员 后端开发

利用SEO策略提升网站排名和流量

九凌网络

软件测试/人工智能|HTTPS加密协议,你会多少?

霍格沃兹测试开发学社

技术人年度回顾:大模型驱动的变革与影响

熬夜磕代码、

大模型

2024营销日历新鲜出炉!提前规划,赢在起跑线!

彭宏豪95

互联网 营销 在线白板 活动策划 效率软件

Google排名高的是什么样的页面?

九凌网络

IT外包对中小企业的独特优势

Ogcloud

外包 IT 外包公司 外包项目 IT 运维

FFA 2023 明日开幕,Flink 智能诊断、小红书流批一体实践精彩来袭

小红书技术REDtech

大数据 flink 架构 流批一体

谷歌史上最强大模型Gemini抢鲜知!!!

江湖修行

AI Google openai #人工智能 #大模型

Kafka集群调优+能力探底

快乐非自愿限量之名

kafka 架构 集群

大模型数据集:力量的源泉,进步的阶梯

来自四九城儿

基于Browscap对浏览器工具类优化

不在线第一只蜗牛

浏览器 软件开发 可视化工具

颠覆你的绘图方式!这8款泳道图工具你用过几款

职场工具箱

泳道图 工具推荐

企业IT外包的四种类型

Ogcloud

外包 IT 外包公司 外包项目 IT 运维

大模型数据集:揭秘AI背后的魔法世界

来自四九城儿

软件测试/人工智能|一文告诉你Python字符串的相关操作

霍格沃兹测试开发学社

分布式基础概念-分布式高可用

派大星

分布式 Java 面试题

【写作训练营打卡|03】

Java多线程系列5:sleep()

BigBang!

Java多线程

KubeSphere Marketpalce 上新!Databend Playground 助力快速启动数据分析环境

Databend

【技术人的 2023】 ——我的AI学习之旅年度总结

YoLo

AI

PostgreSQL 技术内幕(十二)CloudberryDB并行化查询之路

酷克数据HashData

低代码/无代码应用赋能数字化

高端章鱼哥

低代码 数字化 无代码

代币开发:加密货币开发与IDO预售相关指南

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

【智问-Askture】降低企业成本,定制一个专属自己的ChatGPT!

伊克罗德信息科技

AIGC 大语言模型

软件测试/人工智能|一文告诉你Python元组相关操作

霍格沃兹测试开发学社

用户案例|Milvus 助力 Credal.AI 实现 GenAI 安全与可控

Zilliz

Milvus Zilliz AIGC credal

每日一题:LeetCode-105. 从前序与中序遍历序列构造二叉树

Geek_4z9ami

面试 算法 LeetCode 二叉树 Golag

英特尔研究院将在NeurIPS大会上展示业界领先的AI研究成果

E科讯

大模型数据集:探索新维度,引领AI变革

来自四九城儿

inBuilder低代码平台新特性推荐-第十五期

inBuilder低代码平台

低代码

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