写点什么

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

评论

发布
暂无评论

Go编程(二) 多线程简单斗地主

dongfanger

编程 开发 Go 语言

奈学:Java 和 JavaScript 是什么关系?

古月木易

Java

架构1期第三周作业二

道长

极客大学架构师训练营

国庆假期快来了,打开8天长假的正确方式是...

老胡爱分享

读书 书籍推荐 随笔杂谈

看看别人是怎么面试蚂蚁金服的!社招Java面经分享

Java架构师迁哥

Java 阿里巴巴 面试 蚂蚁金服

融云技术分享:基于WebRTC的实时音视频首帧显示时间优化实践

JackJiang

音视频 即时通讯 实时通信

奈学:Java 和 JavaScript 是什么关系?

奈学教育

Java

一次注定失败的裸面

escray

ruby 程序员 面试 面经

2020年行摄回忆录(上)

穿过生命散发芬芳

生活 摄影

图解 K8S 源码 - Deployment Controller 篇

郭旭东

Kubernetes Kubernetes源码

聊一下《技术力量-一线技术团队成功启示录》

Man

中台 研发管理

JAVA集合之ConcurrentHashMap

彭阿三

Java JAVA集合

Go编程(一) 怎么写Go代码

dongfanger

编程 开发 Go 语言

一篇文章搞定 Nginx 反向代理与负载均衡

哈喽沃德先生

nginx 负载均衡 反向代理 服务器 正向代理与反向代理

10多家公司的Java开发面试常见问题合集

Java架构师迁哥

StreamNative 宣布开源 MoP:Apache Pulsar 支持原生 MQTT 协议

Apache Pulsar

开源 云原生 mqtt Apache Pulsar 消息中间件

2020面试阿里字节跳动90%被问到的JVM面试题附答案

Java架构师迁哥

比曲婉婷云尽孝更可怕的是:2020年,低收入家庭仍然在被收割

成周

心理学 教育 培训 维权 曲婉婷

Java源码系列1——ArrayList

超超不会飞

Java

点对点音视频应用场景及优势

anyRTC开发者

音视频 WebRTC 直播 RTC 安卓

甲方日常 24

句子

工作 随笔杂谈 日常

不一样的面向对象(三)

书旅

php 面向对象 面向对象编程

DàYé玩转数据战略Step By Step

曲水流觞TechRill

数据中台 数字化

浅谈滴滴需求响应式公交背后的技术

滴滴技术

滴滴技术 创新公交 路径优化

初学源码之——Spring IOC 应用

Java架构师迁哥

信息公交服务在滴滴的应用实践

滴滴技术

滴滴技术 人工只能 信息公交 路径优化

倒计时!Pulsar Summit Asia 2020 演讲征集

Apache Pulsar

开源 云原生 pulsar Apache Pulsar 消息中间件

Spring 5 中文解析数据存储篇-JDBC数据存储(下)

青年IT男

Spring5

java安全编码指南之:异常处理

程序那些事

java安全编码 java安全 java安全编码指南

数据挖掘技术在轨迹数据上的应用实践

滴滴技术

人工智能 数据挖掘 滴滴技术 轨道技术 创新公交

linux 文件权限控制

kcnf

linux 文件权限控制 acl

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