网站首页 > 技术文章 正文
作者 | A N M Bazlur Rahman
译者 | 刘雅梦
策划 | 丁晓昀
Java 25 通过 JEP 519 将紧凑对象头作为产品特性进行了集成,在不需要更改任何代码的情况下,为开发人员提供了 30% 的 CPU 减少 和显著的内存节省。该特性将对象头大小从 12 字节减少到仅 8 字节,并且只需要一个简单的 JVM 标志即可启用。亚马逊已经在数百个生产服务中对这一特性进行了实战测试。
这一增强解决了 Java 内存模型中长期存在的一个低效问题,即在具有许多小对象的应用程序中,对象头可能会消耗超过 20% 的堆空间。通过将传统的 96 位头压缩到 64 位,使用 Spring Boot、微服务架构和数据处理管道等框架的应用程序可以立即实现性能提升。
在 HotSpot JVM 中,所有对象都驻留在 Java 堆中,Java 堆是进程 C 堆中的一个连续区域。Java 完全通过引用来处理对象,这意味着局部变量包含从栈帧到 Java 堆的指针,引用类型的对象字段指向堆位置之间,并且每个引用都指向对象头的开始。
这种强制性的头结构历来给 Java 应用程序带来了巨大的内存负担,特别是那些处理大量小对象的应用程序。
传统的 HotSpot JVM 对象通过其头携带大量的开销,包括一个 64 位的标记字和一个 32 位的压缩类字。标记字存储特定于实例的元数据,包括垃圾收集年龄和转发指针、稳定的标识哈希码和锁 / 监视器信息。类字包含一个指向元空间中类元数据的压缩指针。
对于平均 32-64 字节的对象,这在实际应用程序中很常见,这个 12 字节的头代表了大约 20% 的开销。
紧凑对象头通过巧妙地将类指针从 32 位压缩到 22 位,并将其与标记字合并到一个单一的 64 位结构中来解决这个问题:
测试显示在各种工作负载中都有引人注目的改进。 SPECjbb2015
显示 堆使用减少了 22%,执行速度提高了 8%,而亚马逊的生产工作负载在数百个服务中最多减少了 30% 的 CPU。垃圾收集性能显著提高,G1 和并行收集器的收集频率 都降低了 15%。JSON 解析基准测试显示,执行时间 减少了 10%,在最坏情况下,吞吐量开销限制在 5%,许多工作负载显示出净收益。
在内存受限的环境中,例如边缘计算和无服务器平台,这些环境中的高效内存利用率直接影响部署密度和成本。
在 Java 25 中启用紧凑对象头需要添加一个单一的 JVM 标志:
Java 24(实验性——需要 JEP 450)
java -XX:+UnlockExperimentalVMOptions -XX:+UseCompactObjectHeaders MyApp
Java 25(集成——JEP 519)
java -XX:+UseCompactObjectHeaders MyApp
该特性可以透明地与 x64 和 AArch64 平台上的现有代码一起工作。应用程序无需修改即可立即获益,尽管某些配置面临限制。开发人员不能将紧凑头与
(已弃用)或旧的堆栈锁定(也已弃用)结合使用。x64 上的 ZGC 支持仍在开发中。
-XX:-UseCompressedClassPointers
该实现通过若干技术突破实现了压缩。22 位类指针支持大约 400 万个惟一类,远远超过了任何实际应用程序的需求。它从 32 位的减少中节省了关键的头空间,同时保持了实际的限制。
JEP 519 代表了 Lilliput 项目的第一个集成特性,Lilliput 项目是 OpenJDK 减少对象内存开销的倡议。该项目的历程展示了精心的工程设计,从 JDK 22 中引入对象监视器表基础设施开始,随后在 JDK 24(2025 年 3 月)中通过 JEP 450 引入实验性紧凑头,最终在 JDK 25(2025 年 9 月)中通过 JEP 519 实现完全集成。
亚马逊的工程团队已经在不同的工作负载中广泛验证了紧凑头。他们成功地将该特性反向移植到 JDK 17 和 21,将其部署到数百个生产服务中,并测量了一致的效率提升而没有回归。这种现实世界的验证影响了将特性集成到 JDK 25 的决定,并为考虑采用这一集成特性的组织提供了信心。
内存效率的改进直接影响现代云部署。容器密度随着应用程序每个实例所需内存的减少而增加,从而允许每个主机的应用程序密度更高,进而降低基础设施成本。由于较小的对象能更好地适应 CPU 缓存,因此缓存利用率得到了提高。由于减少的 GC 压力创造了更一致的响应时间,延迟变得更加可预测。这些好处在微服务架构中是复合的,其中许多小服务能同时受益。
这些改进在成本敏感的环境中尤其有价值,因为在这些环境中,内存效率能直接转化为操作的节省。
对于运行许多小对象的 Java 应用程序的团队来说,这几乎包括了所有现代 Java 工作负载,JEP 519 提供了一个难得的机会:通过简单的配置更改就可以大幅提高性能。该特性集成到 Java 25 中,标志着它已准备好被广泛采用。
原文链接:
https://www.infoq.com/news/2025/06/java-25-compact-object-headers/
声明:本文由 InfoQ 翻译,未经许可禁止转载。
今日好文推荐
猜你喜欢
- 2025-09-03 厉害,GitHub上标星90.7K「Java学习+面试指南」
- 2025-09-03 GitHub上堪称神级的Java技术栈手册火了,看完拿38K妥妥的
- 2025-09-03 Java大数据开发是做什么的?要掌握哪些技能
- 2025-09-03 超全 Java 毕设选题大集合,总有一款适合你!
- 2025-09-03 Java实现10万+并发去重,持续优化
- 2025-09-03 JAVA面试|重载和重写的区别_重载和重写的区别,面向对象的三个特性
- 2025-09-03 【推荐】一款基于 Java + Vue 开源的全响应式的智能安全决策系统
- 2025-09-03 JAVA入门-入门案列+代码_java代码例子讲解
- 2025-09-03 Java 性能优化的 50 个细节(珍藏版)
- 2025-06-12 《我的世界》迎15周年,Java+ 基岩版游戏国区五折售44.5元
- 09-04综艺做成这样都上不了热搜?_综艺节目热播原因
- 09-04webRTC中音频相关的netEQ(二):数据结构
- 09-04每日一词“era”_每日一页歌词
- 09-04css 布局简述_简述css布局技术的特点
- 09-049个专业级别的CSS技巧区分了解和精通的鸿沟
- 09-04BeautifulSoup如何将含有data-tag标签的元素提取出来?
- 09-04CSS 中实现动画效果的方法_css动画制作
- 09-045个CSS新功能,简单好用还超省时间
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)