JDK 25第一个候选版本发布:紧凑对象头、Vector和稳定值


JDK 25现在处于候选发布阶段,build 35作为候选发布。这意味着build 35将是9月份的JDK 25 realease,除非有任何令人震惊的bug。

特征



JDK 25又发明了轮子,但这次是六边形的

JDK 25 一上来就宣布:“我们引入了 PEM 编码的预览 API!” 啥?PEM?就是那个连加密狗都懒得用的古老格式?你是不是以为 Java 终于要进军区块链或者加密货币了?别激动,冷静。这其实就像是你家祖传的腌菜坛子,终于被官方认证可以放进博物馆了。现在,你的密钥和证书终于可以像老式电报一样,用一串“-----BEGIN CERTIFICATE-----”开头的 ASCII 艺术品来展示了。是的,复古风潮已经吹到了 Java 的加密层,仿佛在说:“看,我们也很潮,我们支持 Base64 编码的艺术!”

紧随其后的是“稳定值(Stable Values)”,又一个预览 API。官方说它能让 JVM 把对象当常量优化,性能更好。听起来很厉害?但别忘了,它前面还挂着个“(Preview)”。这意味着什么?意味着这玩意儿就像你公司食堂新推出的“健康餐”——今天说好明天可能就没了,或者后天换了个名儿又回来,但味道已经变了。Java 的语言特性现在走的是“先尝后买,概不退换”的路子,反正社区的反馈?那都是“优化建议”,改不改,全看 Oracle 的心情。

然后是“结构化并发”的第五次预览。第五次!朋友们,这已经不是预览了,这是“无限续杯”。这就像一个永远在 beta 测试的游戏,开发者说:“这次真的稳定了!” 结果你一更新,发现登录界面又换了。结构化并发本意是让多线程编程更简单,但现在看来,它自己才是那个最需要被“结构化”的部分。什么时候它能从“预览”变成“正式”?也许等 Java 支持量子计算的时候吧。

但真正让我笑出声的是“作用域值(Scoped Values)”。官方说它比线程局部变量(ThreadLocal)更好,更安全,性能更高。我只想问一句:那之前那么多用 ThreadLocal 写的代码,是不是都成了“历史的垃圾”?这就像你刚教会你爸用智能手机,他终于学会了微信发红包,结果你告诉他:“爸,现在都用脑机接口了,您那手机过时了。” 他一脸懵逼地看着你,就像我们看着 JDK 不断废弃旧 API 时的表情。

还有“紧凑源文件和实例主方法”,这简直是给初学者的“婴儿学步车”。现在你写个 Hello World 不用再写 public static void main(String args) 了,可以直接写个 main()。哦,太感动了,Java 终于意识到,不是每个程序员都想当架构师,有些人只想快速打印个“你好,世界”。这进步,就像是从马车进化到了自行车——虽然慢,但至少不用喂马了。

最离谱的是“灵活的构造函数体”。现在你可以在 super() 之前写代码了!这有什么大不了的?大不了的是,这打破了 Java 二十多年来的“先调父类,再干别的”铁律。这就像你一直被告知吃饭要先洗手,结果某天专家说:“其实先吃饭再洗手也行,只要饭前手不脏。” 嗯,逻辑上没错,但总感觉哪里怪怪的。



废弃与移除

如果说新功能是“我们又有了新欢”,那废弃功能就是“旧爱必须死”。

JDK 25 大手一挥,移除了好几个老古董。比如,那个可以创建数据报套接字的 Socket 构造函数,终于被扔进了历史的垃圾桶。官方说:“别用了,用 DatagramSocket。” 好吧,这就像你一直用剪刀开快递,现在厂家说:“对不起,剪刀不环保,以后都用手撕。” 问题是,我手撕得动吗?

更绝的是,UseCompressedClassPointers 这个选项被废弃了。官方解释说,未压缩模式基本没人用,还占内存,所以干脆删了。这逻辑很“Java”——我们只保留我们认为你应该用的东西,至于你为什么用那个被删的,不重要。这就像你家的冰箱,有一天你发现冷冻室被焊死了,理由是:“调查显示99%的用户只用冷藏室。”

最讽刺的是,一大批权限类被标记为“废弃以移除”,比如 FilePermissionRuntimePermission 等等。原因?因为安全管理器(Security Manager)被抛弃了。这就像一个城堡,把守卫全解雇了,然后说:“既然没人守门了,那门锁也没用了,拆了吧!” 结果就是,整个城堡的防御体系瞬间归零,只留下一句轻描淡写的:“反正现在没人来偷。”



修复与改动——我们修好了这个 bug,但可能制造了十个新 bug

JDK 25 修复了很多问题。比如,ZGC 现在不会对短命字符串去重了,G1 垃圾回收减少了停顿时间峰值。听起来很棒?但别忘了,这些优化都是在“你的应用符合我们的理想模型”的前提下才成立的。如果你的应用偏偏就是那个“不符合”的例外,那恭喜你,你将有幸成为下一个 bug 报告的主角。

还有一个改动让我笑出了声:File.delete 在 Windows 上不再删除只读文件了。之前它会偷偷去掉只读属性再删,现在不行了,必须你自己先去掉。官方说这是为了“原子性”,避免删到一半失败导致文件属性被改但文件还在。这理由很充分,但实际效果呢?无数老旧的构建脚本、自动化工具将在升级后突然“罢工”,然后开发者们将开始一场盛大的“找茬”游戏,直到有人发现:“哦,原来是 JDK 25 认真了。”

还有,空路径名现在被视为当前目录了。这修复了长期存在的不一致问题。但你猜怎么着?那些依赖旧行为的代码,现在可能会产生意想不到的结果。Java 就像一个固执的老师,坚持认为“正确”的做法只有一种,至于你之前是怎么错的,那都是你的问题。



极客热评:

紧凑的对象头变得稳定可能是我最期待的特性。更低的内存占用,而不必接触任何代码是非常可怕的。



我希望Vector API能被推广到实验阶段。但话又说回来,我更希望他们在发布之前尽可能地完善它,而不是匆忙发布。


稳定值的忠实粉丝,可能是我经常使用的功能之一。