2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Java 25 在 JEP 519 中集成了紧凑对象头

  • 2025-06-19
    北京
  • 本文字数:1735 字

    阅读完需:约 6 分钟

大小:910.13K时长:05:10
Java 25在JEP 519中集成了紧凑对象头

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 平台上的现有代码一起工作。应用程序无需修改即可立即获益,尽管某些配置面临限制。开发人员不能将紧凑头与 -XX:-UseCompressedClassPointers (已弃用)或旧的堆栈锁定(也已弃用)结合使用。x64 上的 ZGC 支持仍在开发中。

 

该实现通过若干技术突破实现了压缩。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/

2025-06-19 18:0010935

评论

发布
暂无评论

从0到1:校园生活圈小程序开发笔记(一)

CC同学

适应多样化需求:WASM 插件在全链路灰度发布中的应用

阿里巴巴云原生

阿里云 微服务 云原生

XPath定位如何在App自动化测试中大显神威

霍格沃兹测试开发学社

Orangedx:引领新一轮 BTCFi 浪潮

股市老人

Orangedx:引领新一轮 BTCFi 浪潮

股市老人

事业-最佳实践-编码-单一职责判断

南山

设计模式 设计原则 单一职责 类职责 方法职责

Knative 助力 XTransfer 加速应用云原生 Serverless 化

阿里巴巴云原生

阿里云 云原生 Knative

面对API的安全风险,WAAP全站防护的作用

德迅云安全杨德俊

Solidity案例详解(七)供应链金融合约

BSN研习社

区块链 Solidity

论低代码开与AI时代的适配性

不在线第一只蜗牛

人工智能 AI 低代码

轻松搞定企业管理:这10个免费模板值得收藏!

彭宏豪95

企业管理 在线白板 企业管理软件 办公软件 效率软件

Flink 中 Task(任务)的概念、定位及应用详解与易混淆点梳理

木南曌

flink 实时计算

node.js这些常用命令,你都会了吗?

霍格沃兹测试开发学社

事业-最佳实践-编码-提升团队代码质量

南山

团队管理 代码质量 编码质量

苹果头显产品年内中国上市;「美版贴吧」Reddit 苦熬 19 年终上市丨 RTE 开发者日报 Vol.170

声网

电源缓启动(软起动)原理

芯动大师

芯片 电源 热插拔

关于 ASP.NET Core 内置的依赖注入

雄鹿 @

ASP.NET Core

在 ASP.NET Core 中引入 Serilog 记录日志

雄鹿 @

ASP.NET Core

如何选择性价比高的国外云主机服务?

一只扑棱蛾子

云主机 国外云主机

使用Docker搭建MySQL数据库服务

霍格沃兹测试开发学社

Docker搭建持续集成平台Jenkins最简教程

霍格沃兹测试开发学社

“产研六力”模型:引领企业创新发展的新路径

凌晞

研发管理 产品管理 #研发

Java 25在JEP 519中集成了紧凑对象头_架构_A N M Bazlur Rahman_InfoQ精选文章