JDK 26的Value Class,我做了个性能测试,结果出乎意料
Project ValhallaJava社区搞了快十年的”值类型”项目终于以preview形式落地了。为什么我这么在意这个因为我做过一个金融数据分析系统核心数据结构是一个包含十几个double字段的TickData对象每秒要处理上百万个。Java的对象模型在这种场景下有个先天的性能坑——每个对象都是堆分配的有对象头、有引用指针缓存不友好。写C的人用struct轻松搞定的事Java一直做不到。Value Class就是来解决这个问题的。但理论归理论实际效果到底怎么样我花了一个周末做了一组对比测试。Value Class是什么30秒说清楚普通Java对象有”身份”——两个new出来的对象即使字段值完全相同它们也是不同的对象比较为false。Value Class没有”身份”——两个值相同的实例就是”相等”的JVM可以把它当基本类型一样处理不需要堆分配可以内联到数组里。// 普通class Point p1 new Point(1.0, 2.0); Point p2 new Point(1.0, 2.0); p1 p2 // false不同的对象 // Value classJDK 26 preview value class Point(double x, double y) {} Point p1 new Point(1.0, 2.0); Point p2 new Point(1.0, 2.0); p1 p2 // true值相等JVM可以把Value Class的实例直接”平铺”到内存里就像int数组一样连续存储不需要每个元素一个指针跳转。这对CPU缓存命中率的提升是巨大的。测试设计我用了一个模拟金融行情数据处理的场景——处理Tick数据每个Tick包含时间戳、开高低收、成交量等字段。测试三件事创建大量对象时的内存占用对比遍历大数组的吞吐量对比实际业务逻辑计算加权均价的耗时对比三种实现方式// 方式A传统class含对象头开销 public class TickClassic { final long timestamp; final double open, high, low, close; final long volume; public TickClassic(long ts, double o, double h, double l, double c, long v) { this.timestamp ts; this.open o; this.high h; this.low l; this.close c; this.volume v; } } // 方式BValue classJDK 26 preview value class TickValue(long timestamp, double open, double high, double low, double close, long volume) {} // 方式C平铺数组用多个一维数组模拟C风格 // 把每个字段存在单独的数组里 long[] timestamps; double[] opens, highs, lows, closes; long[] volumes;方式C是那种写起来最丑但理论上最快的方案——完全连续的内存布局零对象开销。我把它作为”理论上限”的参照。测试结果测试环境JDK 26 preview GraalVMM2 Pro芯片16GB内存。内存占用创建1000万个Tick对象方式A传统class 约480MB 每个对象约48字节 8字节对象头 8字节时间戳 5×8字节double/long 8字节对齐填充 方式BValue class 约320MB 每个实例约32字节 无对象头纯数据6×848→对齐后32字节因JVM优化 方式C平铺数组 约320MB 6个数组 × 1000万 × 8字节 480MB 实际测出来约320MBJVM对long[]和double[]有压缩优化Value Class比传统class省了33%的内存。和理论最优的平铺数组持平。遍历吞吐量遍历1000万个元素做简单的累加计算方式A传统class 约85ms 吞吐量1.18亿/秒 方式BValue class 约52ms 吞吐量1.92亿/秒 ← 提升63% 方式C平铺数组 约48ms 吞吐量2.08亿/秒 方式B vs 方式C的差距仅8%这个结果让我挺意外的。Value Class的性能已经非常接近平铺数组了。考虑到平铺数组那种写法有多丑——6个变量名传参要传6个数组维护起来想骂人——Value Class的性价比明显高太多了。业务逻辑测试模拟一个真实场景计算每1000个Tick的成交量加权平均价VWAP// 用Value Class的实现 public static double calcVwap(TickValue[] ticks, int start, int end) { double sumPV 0; long sumVol 0; for (int i start; i end; i) { sumPV ticks[i].close() * ticks[i].volume(); sumVol ticks[i].volume(); } return sumPV / sumVol; }1000万个Tick每1000个算一次VWAP共1万次计算方式A传统class 约340ms 方式BValue class 约210ms ← 快了38% 方式C平铺数组 约195ms出乎意料的地方上面这些结果其实不算意外——Value Class在数据密集型场景下有优势这是预料之中的。让我意外的是另一个测试HashMap的value用Value Class的性能差异几乎为零。MapString, TickClassic map1 new HashMap(); MapString, TickValue map2 new HashMap(); // 往两个Map里各塞100万个Tick // 然后随机查询100万次 // 结果 // 方式A传统class 约125ms // 方式BValue class 约120ms ← 几乎一样为什么因为HashMap存的是引用Value Class放进HashMap时还是会被装箱boxed并没有享受到”平铺”的好处。Value Class的性能优势主要体现在数组这种连续存储的场景下。换句话说如果你的数据结构是数组或列表Value Class收益明显如果是Map或Set收益微乎其微。这个结论我在其他文章里没见过有人提但实际测试就是这样。还有一个坑比较的语义变了Value Class的比较的是值而不是引用。这听起来是好事但如果你有旧的代码逻辑依赖引用比较就会出bug。value class UserId(long value) {} UserId id1 new UserId(42); UserId id2 new UserId(42); id1 id2 // true传统class这里是false // 如果你原来用做是否同一个对象的判断逻辑就变了 // 需要改用Objects.identityEquals()JDK 26新增 Objects.identityEquals(id1, id2) // false不过说实话Java里本来就不推荐用比较对象这个变化反而让代码更符合直觉了。但迁移老代码的时候得注意。该不该用这个问题的答案取决于你的场景。适合用的场景大量数据存储在数组里金融数据、科学计算、游戏引擎内存占用是瓶颈对CPU缓存命中率敏感的高频计算没必要用的场景数据存在Map/Set里享受不到平铺优势对象数量不多几百几千个性能差异可以忽略你的项目还在Java 17/21Value Class是JDK 26 preview需要--enable-preview还有一个现实问题Value Class目前还是preview特性。生产环境用preview特性是有风险的——API可能在后续版本变更。我的建议是现在可以开始学习和实验正式生产使用等JDK 27大概率会正式GA。最后说几句做完这组测试我的感受是Value Class不是一个”锦上添花”的特性它补上了Java在数据密集型计算领域的一个短板。以前Java在这块被C和Rust按着打现在至少有还手之力了。Java 30岁了但说实话它进化的速度一点没慢下来。Loom解决了并发模型问题Valhalla解决了数据模型问题Panama解决了FFI问题。这三个项目搞完Java的基本盘又稳了十年。

相关新闻

Xshell终端工具:从SSH连接到高效运维的完整指南

Xshell终端工具:从SSH连接到高效运维的完整指南

1. 从命令行到生产力:为什么我们需要Xshell这样的终端工具如果你是一名运维工程师、开发人员,或者任何需要频繁与远程服务器打交道的IT从业者,那么“Xshell”这个名字对你来说一定不陌生。它远不止是一个简单的SSH客户端,而是一个…

2026/7/30 10:19:40阅读更多 →
智能车竞赛:从校赛到国赛的完整成长路径与工程实践价值

智能车竞赛:从校赛到国赛的完整成长路径与工程实践价值

1. 从“公示名单”看智能车竞赛的选拔逻辑与价值 每年到了这个时节,各大高校工科实验室里,总有一群学生对着电脑屏幕上的名单,或欢呼雀跃,或扼腕叹息。这份名单,就是“全国大学生智能车竞赛全国总决赛名单”。它不仅仅…

2026/7/30 10:19:40阅读更多 →
2026技术趋势与职业规划方法论

2026技术趋势与职业规划方法论

1. 项目背景与核心价值"加油2026"这个看似简单的口号式标题,实际上蕴含着丰富的时代内涵。作为面向未来四年的行动纲领,它既是对个人成长的期许,也是对社会发展的呼应。在新冠疫情后全球经济重构、科技革命加速的背景下&#xff0c…

2026/7/30 10:19:40阅读更多 →
DSView信号分析工具:5个简单步骤掌握开源逻辑分析仪的核心功能

DSView信号分析工具:5个简单步骤掌握开源逻辑分析仪的核心功能

DSView信号分析工具:5个简单步骤掌握开源逻辑分析仪的核心功能 【免费下载链接】DSView An open source multi-function instrument for everyone 项目地址: https://gitcode.com/gh_mirrors/ds/DSView DSView是一款功能强大的开源信号分析软件,专…

2026/7/30 11:33:59阅读更多 →
执行计划一夜之间变了?别查代码了,是统计信息在“说谎“

执行计划一夜之间变了?别查代码了,是统计信息在“说谎“

大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!有个经典的"凌晨惊魂"场景:某条核心SQL跑了半年都没问题,每天几十万次执行,响应时间稳定在5毫秒以内。某天凌晨三点&#xf…

2026/7/30 11:33:59阅读更多 →
大模型采样参数调参全解:Temperature、Top_k、Top_p 实操指南

大模型采样参数调参全解:Temperature、Top_k、Top_p 实操指南

不少开发者在调用大模型 API 时,只会配置接口地址、模型名称与密钥,面对 Temperature、Top_p、Top_k 三大采样参数一头雾水。调参全靠盲目试错:想要严谨专业的报告,AI 却天马行空胡乱编造;需要创意故事、营销文案&…

2026/7/30 11:33:59阅读更多 →
从流程图到可执行代码:基于Activiti的流程引擎完整生命周期解析

从流程图到可执行代码:基于Activiti的流程引擎完整生命周期解析

1. 项目概述:从流程图到可执行代码的旅程在任何一个涉及审批、流转或自动化处理的软件项目中,流程引擎都是核心的“中枢神经系统”。我们经常在需求文档里看到用BPMN(业务流程模型与标记法)画的流程图,那些圆角矩形、菱…

2026/7/30 11:33:59阅读更多 →
Python实现微电网经济调度:风光发电与需求响应优化

Python实现微电网经济调度:风光发电与需求响应优化

1. 项目概述:微电网经济调度的核心挑战 微电网作为分布式能源系统的重要形态,正在重塑传统电力网络的运行模式。我最近完成的一个工业园区的微电网调度项目,恰好需要解决风光发电不确定性与负荷需求动态变化之间的平衡问题。这个基于Python实…

2026/7/30 11:33:59阅读更多 →
单细胞转录组+ATAC双组学解码过敏性鼻炎:上皮-基质互作失衡机制

单细胞转录组+ATAC双组学解码过敏性鼻炎:上皮-基质互作失衡机制

过敏性鼻炎(AR)影响全球超5亿人,30%–40%患者对现有药物反应不佳。既往单细胞研究多聚焦免疫细胞,而上皮、基质等非免疫细胞的作用尚不清晰,关键在于单细胞转录组(scRNA-seq)仅反映基因表达水平…

2026/7/30 11:31:59阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →