Java 25 在 JEP 519 中集成了紧凑对象头
myzbx 2025-09-01 09:53 5 浏览
作者 | 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 翻译,未经许可禁止转载。
今日好文推荐
相关推荐
- 半导体行业术语缩写词典总结-JKL_半导体词汇缩写表
-
作为半导体行业新人来说,最痛苦的莫过于各种缩写词术语了,有的缩写词一样但是会有不同的解释。这里作者给大家整理了部分术语词典,后面会按照更新顺序一一分享出来。废话不多说,直接开始,如有遗漏,欢迎大家在评...
- JD.com Deepens Push Into Embodied Intelligence With Investment in Sensor Maker PaXiniTech
-
ToraOne,thesecond-generationmultidimensionaltactilehumanoidrobotdevelopedbyPaXiniTechTMTPOS...
- Hong Kong's Consumer Market Becomes New Battleground for Chinese Mainland Internet Giants
-
AI-generatedimageTMTPOST--StrollthroughthestreetsofHongKongtoday,anditmightfeellikey...
- http2解决了哪些问题_简述http2的优点
-
HTTP/2(最初称为SPDY)是HTTP协议的第二个主要版本,它在HTTP/1.1的基础上进行了重大改进,旨在解决其在性能和效率方面的诸多瓶颈。以下是HTTP/2主要解决的问题:队头阻...
- China's economy stays strong and vital amid pressure
-
Peoplevisitthe4thChina-CEECExpo&InternationalConsumerGoodsFairinNingbo,eastChina's...
- JD.com Makes $2.4 Billion Bid for Ceconomy in Bold Push to Build a Global Retail Empire
-
TMTPOST--JD.comhasunveiledplanstoacquireGermany’sCeconomyAG—theparentofEurope’sleading...
- 深入剖析 Java 中的装饰器设计模式:原理、应用与实践
-
在Java软件开发的广阔天地里,设计模式犹如璀璨星辰,照亮我们构建高效、可维护系统的道路。今天,让我们聚焦于其中一颗闪耀的星——装饰器设计模式,深入探究它的奥秘,看看如何利用它为我们的代码赋予...
- 组合模式应用-适配器模式_适配器组件
-
写在前面Hello,我是易元,这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误,欢迎大家留言指正!该部分为各模式组合使用,涉及代码较多,熟能生巧。内容回顾定义适配器模式是一种结构型设计模式,...
- OOM (Out Of Memory) 故障排查指南
-
1.确认OOM类型首先需要确认是哪种类型的OOM:JavaHeapOOM:Java堆内存不足NativeMemoryOOM:本地内存不足MetaspaceOOM:元空间内存不足Contai...
- 刷完这49题,面试官当场给Offer!Java程序员必备指南
-
1.问题:如果main方法被声明为private会怎样?答案:能正常编译,但运行的时候会提示”main方法不是public的”。2.问题:Java里的传引用和传值的区别是什么?答案:传引用是指传递的是...
- C#编程基础(看这一篇就够了)_c#编程入门与应用
-
C#及其开发环境简介C#概述C#是一个现代的、通用的、面向对象的编程语言,由微软(Microsoft)开发,经Ecma和ISO核准认可。它由AndersHejlsberg和他的团队在.NET框架开发...
- 说一下JDK的监控和 线上处理的一些case
-
一句话总结JDK监控常用工具包括JConsole、VisualVM、JMC等,用于实时查看内存、线程、GC状态。线上常见问题处理:内存泄漏通过heapdump分析对象引用链;频繁GC可调整-Xmx/...
- JavaScript深拷贝极简指南:3种方法解决嵌套与循环引用难题
-
为什么需要深拷贝?首先我们看看浅拷贝,point指向的是同一个地址,这时我们修改obj2.point的属性时,obj1的point属性也会被修改再看看深拷贝,point指向的是不同地址,这时我们修改o...
- Java 25 在 JEP 519 中集成了紧凑对象头
-
作者|ANMBazlurRahman译者|刘雅梦策划|丁晓昀Java25通过JEP519将紧凑对象头作为产品特性进行了集成,在不需要更改任何代码的情况下,为开发人员提供了...
- 每日一练 Python 面试题(1)_python每日一记
-
以下是5道Python基本语法相关的面试题,涵盖变量、运算符、数据结构、函数和异常处理等核心概念:1.变量与作用域题目:以下代码的输出是什么?解释原因。x=10deffunc():...
- 一周热门
- 最近发表
-
- 半导体行业术语缩写词典总结-JKL_半导体词汇缩写表
- JD.com Deepens Push Into Embodied Intelligence With Investment in Sensor Maker PaXiniTech
- Hong Kong's Consumer Market Becomes New Battleground for Chinese Mainland Internet Giants
- http2解决了哪些问题_简述http2的优点
- China's economy stays strong and vital amid pressure
- JD.com Makes $2.4 Billion Bid for Ceconomy in Bold Push to Build a Global Retail Empire
- 深入剖析 Java 中的装饰器设计模式:原理、应用与实践
- 组合模式应用-适配器模式_适配器组件
- OOM (Out Of Memory) 故障排查指南
- 刷完这49题,面试官当场给Offer!Java程序员必备指南
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)