6月15日,Oracle工程师Lois Foltan确认了一个让大部分Java社区不再相信会到来的消息:JEP 401(Value Classes and Objects,即”Valhalla项目”的核心JEP)正式合并入OpenJDK主仓库,目标版本JDK 28。这个PR新增了超过19.7万行代码,修改了1,816个文件,规模之大以至于其余提交者被要求在合并期间暂缓大型提交。
“代码像类,运行像int”
Valhalla项目从2014年启动以来,始终带着一句标志性的口号:”codes like a class, works like an int.” 一句话说尽了整个项目的核心目标:我们希望写出正常的、可读的类,但在内存中获得原始类型级别的性能和布局密度。
这个看似简单的目标需要JVM在根本层面上重新思考对象模型。传统Java对象在内存中的布局包含对象头(header)、到堆的指针引用等开销,而Valhalla的值类型允许数据直接在栈上或密集排列在数组中——没有对象头、没有指针跳转。对于一个包含两个32位int的Point类来说,这意味着从原本的几十字节开销缩减到8字节的紧密排列。
为什么花了十年
JVM Weekly本期用一整篇深度长文讲述了Valhalla的完整演变史:从2014年最初的问题陈述,到大量被废弃的设计方案(包括曾一度被认为很有前途的Q-world/L-world模型),再到最终在Brian Goetz领导下逐步收敛的设计。Goetz本人的评价很精准:那些一直说”他们永远不会发布”的人,现在会无缝切换到”但他们没有发布最重要的部分”。
确实需要冷静——这次合并的是Valhalla的”第一部分”,且默认禁用,属于预览特性。值类型的完整愿景(包括泛型特化、原始类型的统一处理等)还需要更多JEP在未来版本中交付。
HN社区:十年等待之后
HN社区对Valhalla入主的反应充满技术深度和情感张力。用户DarkNova6说:”你完全可以写一部关于Java值类型演进的技术惊悚小说。我一直在读邮件列表、看所有相关视频,他们如何将设计整合到始终看起来像Java的东西上,同时在值类型的粒度和理解上走得更深——这真的令人鼓舞。”
争议同样激烈。petilon提出了”统一性法则”的担忧:”a = new Point(10,10); b = a; a.x = 100; System.out.println(b.x) —— 这段代码的输出现在取决于Point是值类还是引用类。可读性会因此受损。”这是值类型引入的一个根本性权衡:性能收益 vs. 语义直觉的清晰性。
devin的观察击中要害:”每次在HN的Java/JVM相关评论区,总有惊人数量的人对JVM或Java的认知停留在过去。2026年的Java是一个非常合适的技术捕食者——它有瑕疵,但底层架构极其强大。”
这场讨论也折射出Java语言演化的独特张力:既要背负25年的历史包袱,又要在现代编程语言的竞争压力下不断进化。Valhalla也许是Java社区等待最久的功能,但它的到来证明了一件事——Java仍然在某些方面认真到让人敬畏。
📎 原文:JVM Weekly vol.180
💬 HN讨论:325条评论