Java25值得关注的特性
Java 25 上手:少写样板代码,顺便省点内存
Java 25 在 2025 年 9 月发布,是继 Java 21 之后的又一个 LTS。和 21 相比,这个版本没有虚拟线程那种量级的变化,更多是在语法糖、启动性能和内存占用上做文章。如果团队正准备从 21 往上迁,下面几项可以先看。
写 Hello World 不用再套类了
Java 25 把紧凑源文件和实例 main 方法转正了。现在一个文件里可以直接写:
void main() {
System.out.println("Hello, Java 25");
}
保存成 Hello.java,运行 java Hello.java 就行。不用写 class,不用 public static,也不用 String[] args。java.base 里的类默认可见,List、Map 这些直接能用。
这个特性主要是给脚本、小工具和教学用的。正经项目还是按原来的类结构写,别为了少写几行把工程结构搞乱。
构造函数里可以先做校验了
以前在构造函数里,想在校验参数之后再调用 super(),是做不到的。Java 25 的灵活构造函数体放开了这个限制:
class User extends Person {
private final String name;
User(String name) {
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("name 不能为空");
}
super(name);
this.name = name;
}
}
只要不碰 this,也不读写实例字段,语句可以放在 super() 前面。参数校验、简单计算都能提前做,报错也更早。
一行 import 整个模块
模块导入声明也转正了。以前要用 java.base 里的类,得一个个 import;现在可以这样:
import module java.base;
public class Demo {
public static void main(String[] args) {
var list = List.of("a", "b", "c");
System.out.println(list);
}
}
import module java.base; 会把 java.base 导出的公共类型都引进来。写小工具、做原型很方便。大项目里还是建议显式 import,不然同名类型多了,排查起来麻烦。两个模块导出同名类时,编译器会报错,得用单类型导入解决。
Scoped Values:ThreadLocal 的替代品
作用域值在 Java 25 转正。它用来在同一个线程和子线程之间共享不可变数据,比 ThreadLocal 少了很多坑:
private static final ScopedValue<String> USER = ScopedValue.newInstance();
void handle() {
ScopedValue.where(USER, "alice").run(() -> {
System.out.println(USER.get());
});
}
绑定只在 run() 的作用域内有效,出了作用域自动失效,不用记得 remove()。子线程能继承,和虚拟线程、结构化并发配合得不错。请求上下文、用户身份、租户信息这类场景,可以优先考虑它。
Compact Object Headers:对象头瘦身
Java 25 把紧凑对象头从实验特性转成了产品特性。64 位平台上,对象头从 12 字节降到 8 字节,堆里对象越多,省下来的内存越可观。
它默认是关的,要手动开:
-XX:+UseCompactObjectHeaders
不用再加 UnlockExperimentalVMOptions。开了之后,对象头变小,缓存局部性也会好一些,对内存敏感的服务值得试试。两个注意点:类加载数量特别大的应用要先确认限制;实际能省多少要看对象大小和 8 字节对齐,不是每个对象都稳定省 4 字节。
启动更快:AOT 缓存和 JFR 改进
JDK 25 继续推进 Project Leyden。AOT 缓存的用法简化成了一条命令:生成时加 -XX:AOTCacheOutput=app.aot,它会在内部完成训练和缓存生成;启动时换成 -XX:AOTCache=app.aot,省掉一部分类加载和链接的时间。AOT 方法剖析也加上了,启动后的预热会更快。
JFR 这边有几项更新:CPU 时间采样(实验性)、协作采样、方法级计时与追踪。排查启动慢、CPU 飙高这类问题,工具比之前好用。这些偏运行时,业务代码不用改,升级后拿一个服务跑一下启动时间,比看参数说明直观。
还有几个预览特性
Java 25 还有几项没转正的东西,尝鲜要加 --enable-preview:
- 原始类型模式匹配(第三次预览):
case int i ->这种写法,省掉装箱 - 结构化并发(第五次预览):把一组相关任务当成一个整体管理
- Stable Values(预览):延迟初始化的不可变常量,JVM 可以按 final 字段优化
- PEM 编码(预览):把密钥、证书编成 PEM 文本
预览特性 API 还可能变,生产环境先别上。
升级前注意
32 位 x86 的移植在 Java 25 里被移除了。如果还有老机器跑 32 位 JVM,升级前先确认。
另外,Java 25 是 LTS,支持周期比非 LTS 长,适合作为团队的下一个落脚点。但别一次全量切,先挑一个非核心服务,开上 compact object headers 和 AOT 缓存,压测启动时间、内存和吞吐,再决定铺不铺开。
语法上的几个改动,日常最容易被用上的是紧凑源文件和 import module,写小脚本确实省事,构造函数校验也顺手。真正影响线上指标的,还是对象头和 AOT 这些运行时优化,得靠数据说话。
- 点赞
- 收藏
- 关注作者
评论(0)