Java25值得关注的特性

举报
yd_214609086 发表于 2026/11/09 11:40:05 2026/11/09
【摘要】 紧凑源文件和实例 main、灵活构造函数体、import module、Scoped Values、Compact Object Headers、AOT 缓存和 JFR 改进

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 这些运行时优化,得靠数据说话。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。