Skip to main content

Java 24 新特性 (EOL)

warning

生命周期结束时间(EOL): 2025/09/18

官方发布介绍页面:https://openjdk.org/projects/jdk/24/

1. 语言特性与预览​

JEP 488:模式、instanceof 和 switch 支持原始类型(第二次预览)​

  • 允许在所有模式上下文(如 instanceof、switch)中直接使用原始类型(如 int、double、boolean 等),不仅限于引用类型。
  • 统一了模式匹配语法,减少装箱/拆箱操作,提升性能和代码可读性。
  • 示例:
    Object obj = 42;
    if (obj instanceof int i) {
    System.out.println("是 int 类型,值为:" + i);
    }
    switch (obj) {
    case int n -> System.out.println("int: " + n);
    default -> System.out.println("其他类型");
    }
  • 该特性为预览特性,需通过编译参数开启。

JEP 492:灵活的构造函数体(第三次预览)​

  • 允许在构造函数的 this(...) 或 super(...) 调用前,编写变量声明、前置校验等语句。
  • 便于更灵活地初始化对象,提升代码可维护性。
  • 示例:
    public class User {
    private final String name;
    public User(String name) {
    Objects.requireNonNull(name, "name 不能为空");
    this.name = name;
    }
    }

JEP 494:模块导入声明(第二次预览)​

  • 引入 import module 语法,允许在源文件中显式声明依赖的模块。
  • 新增 import module xxx;,便于工具链分析依赖关系,提升大型项目的模块管理能力。
  • 示例:
    import module com.example.util;

JEP 495:简化 main 方法(第四次预览)​

  • 允许 Java 程序入口 main 方法省略 String[] args 参数,简化入门和脚本式开发体验。
  • 现在可以直接写 public static void main(),无需参数。
  • 适合教学、演示、脚本等场景,降低 Java 入门门槛。
  • 若需要命令行参数,仍可使用传统 main(String[] args)。
  • 示例:
    public class Hello {
    public static void main() {
    System.out.println("Hello, Java 24!");
    }
    }

JEP 499:结构化并发(第四次预览)​

  • 引入结构化并发 API,简化多线程任务的管理和错误处理,提升并发编程的安全性和可维护性。
  • 新增 StructuredTaskScope 等类,支持任务分组、统一取消、异常传播等。
  • 便于实现父子任务的生命周期绑定,防止线程泄漏。
  • 示例:
    try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
    Future<String> user = scope.fork(() -> findUser());
    Future<Integer> order = scope.fork(() -> findOrder());
    scope.join();
    // 统一处理结果
    }

2. 性能与运行时​

JEP 450:紧凑对象头(实验性)​

  • 优化 Java 对象头部的内存布局,64 位平台下部分对象头从 16 字节缩减为 8 字节。
  • 降低 Java 应用的内存消耗,提升云原生、微服务等高密度部署场景的资源利用率。
  • 该优化对应用透明,无需代码层面适配。

JEP 475:G1 垃圾回收器的延迟屏障展开​

  • 优化 G1 GC 的写屏障处理时机,将其推迟到 JIT 编译阶段,减少不必要的屏障,降低运行时开销。
  • 提升 G1 GC 在高并发场景下的吞吐量和响应速度。

JEP 404:分代 Shenandoah 垃圾回收器(实验性)​

  • Shenandoah GC 引入分代模式,提升吞吐量和内存利用率。
  • 适合大规模、高并发、低延迟场景。

JEP 483:提前类加载与链接​

  • 支持在应用启动前,将部分类提前加载和链接,减少启动时的延迟。
  • 提升大型应用、微服务的冷启动速度,适合云原生、容器化场景下的弹性伸缩。

JEP 491:虚拟线程同步时不再固定平台线程​

  • 优化虚拟线程(Project Loom)在同步块(synchronized)中的表现,避免虚拟线程被固定(pin)到物理线程。
  • 允许虚拟线程在进入同步块时被挂起和恢复,提升资源利用率。
  • 适合高并发、IO 密集型应用。

3. 标准库与 API​

JEP 485:流收集器(Stream Gatherers)​

  • 为 Java Stream API 引入 Gatherer(收集器)机制,支持更灵活的数据收集与转换。
  • 新增 Stream.gather() 等 API,便于实现复杂的数据流处理,如窗口、分组、聚合等。
  • 扩展了 Stream 的表达能力,适合大数据、实时计算等场景。
  • 示例:
    import java.util.stream.*;
    import java.util.*;

    // 假设有一个整数流,按每 3 个分组求和
    List<Integer> input = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    List<Integer> result = input.stream()
    .gather(Gatherer.of(
    () -> new int[2], // 状态:int[0]=计数,int[1]=累加和
    (state, item, downstream) -> {
    state[0]++;
    state[1] += item;
    if (state[0] == 3) {
    downstream.push(state[1]); // 每 3 个输出一次和
    state[0] = 0;
    state[1] = 0;
    }
    return true;
    },
    (state, downstream) -> {
    if (state[0] > 0) {
    downstream.push(state[1]); // 处理剩余项
    }
    }
    ))
    .collect(Collectors.toList());
    System.out.println(result); // 输出: [6, 15, 24]
    // 该示例展示了如何用 Gatherer 实现窗口分组求和。

JEP 484:类文件 API​

  • 提供标准化的 Java 类文件读写 API,便于工具链、框架安全地操作 class 文件。
  • 新增 java.lang.classfile 包,支持 class 文件的解析、生成、修改。
  • 替代第三方库(如 ASM、BCEL)的一些场景,提升安全性和兼容性。

JEP 487:作用域值(Scoped Values,第四次预览)​

  • 引入作用域值(ScopedValue),为线程安全地传递只读数据提供新机制,替代 ThreadLocal 的部分场景。
  • 支持在指定作用域内传递数据,生命周期受控,避免内存泄漏。
  • 适合并发、异步编程场景下的数据传递。
  • 示例:
    import java.lang.ScopedValue;
    import java.util.concurrent.*;

    // 定义一个作用域值
    static final ScopedValue<String> USER = ScopedValue.newInstance();

    public static void main(String[] args) throws Exception {
    // 在主线程作用域内设置 USER
    ScopedValue.where(USER, "张三").run(() -> {
    System.out.println("主线程用户: " + USER.get()); // 输出: 张三
    // 在线程池中异步任务中传递作用域值
    ExecutorService pool = Executors.newFixedThreadPool(1);
    Future<?> f = pool.submit(() -> {
    // 作用域值会自动传递到子线程
    System.out.println("子线程用户: " + USER.get()); // 输出: 张三
    });
    try { f.get(); } catch (Exception e) { e.printStackTrace(); }
    pool.shutdown();
    });
    // 作用域外访问会抛出异常
    // System.out.println(USER.get()); // IllegalStateException
    }
    // 该示例展示了作用域值的基本用法及其在多线程环境下的安全传递。

JEP 489:Vector API(第九次孵化)​

  • 持续孵化的 Vector API,支持在 Java 中高效利用 SIMD 指令进行向量化运算,提升数值计算性能。
  • 新增 jdk.incubator.vector 包,支持多种数据类型的向量操作。
  • 适合科学计算、机器学习、图像处理等高性能场景。
  • 示例:
    import jdk.incubator.vector.FloatVector;
    import jdk.incubator.vector.VectorSpecies;

    public class VectorDemo {
    static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;

    public static void main(String[] args) {
    float[] a = {1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f};
    float[] b = {8f, 7f, 6f, 5f, 4f, 3f, 2f, 1f};
    float[] c = new float[a.length];
    int i = 0;
    // 向量化加法
    for (; i < SPECIES.length(); i += SPECIES.length()) {
    var va = FloatVector.fromArray(SPECIES, a, i);
    var vb = FloatVector.fromArray(SPECIES, b, i);
    var vc = va.add(vb);
    vc.intoArray(c, i);
    }
    // 处理剩余标量部分
    for (; i < a.length; i++) {
    c[i] = a[i] + b[i];
    }
    System.out.println(java.util.Arrays.toString(c)); // 输出: [9.0, 9.0, 9.0, 9.0, 9.0, 9.0, 9.0, 9.0]
    }
    }
    // 该示例展示了如何用 Vector API 实现高效的向量加法。

JEP 478:密钥派生函数 API(预览)​

  • 新增标准化的密钥派生函数(KDF)API,便于安全地从主密钥派生子密钥。
  • 支持 PBKDF2、HKDF、scrypt 等主流算法,提升密码学操作的安全性和一致性。
  • 示例:
    import javax.crypto.SecretKey;
    import javax.crypto.spec.PBEKeySpec;
    import java.security.spec.KeySpec;
    import java.util.Base64;
    import java.security.SecureRandom;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKeyFactory;

    public class KDFDemo {
    public static void main(String[] args) throws Exception {
    String password = "myPassword";
    byte[] salt = new byte[16];
    new SecureRandom().nextBytes(salt);
    int iterations = 65536;
    int keyLength = 256;
    // 使用 PBKDF2WithHmacSHA256 派生密钥
    KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, keyLength);
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
    SecretKey key = factory.generateSecret(spec);
    byte[] encoded = key.getEncoded();
    System.out.println("派生密钥: " + Base64.getEncoder().encodeToString(encoded));
    }
    }
    // 该示例展示了如何用标准 KDF API 派生密钥并进行参数配置。

JEP 496:抗量子密钥封装机制(ML-KEM)​

  • 引入基于模块格的抗量子密钥封装机制(ML-KEM),提升对抗量子计算攻击的能力。
  • 提供标准 API,便于集成新一代加密算法。

JEP 497:抗量子数字签名算法(ML-DSA)​

  • 引入基于模块格的抗量子数字签名算法(ML-DSA),增强数字签名的安全性。
  • 适应未来量子计算威胁。

4. 工具链与监控​

JEP 493:无 JMOD 运行时镜像链接​

  • 支持在不依赖 JMOD 文件的情况下链接运行时镜像,提升定制化部署灵活性。

5. 兼容性、移除与废弃​

JEP 472:准备限制 JNI 使用​

  • 对 JNI 和 FFM API 的使用发出警告,为未来默认限制本地互操作做准备。
  • 鼓励开发者迁移到更安全的 API。

JEP 486:永久禁用 Security Manager​

  • Security Manager 彻底禁用,相关 API 未来将被移除。
  • 彻底移除基于 Security Manager 的安全模型,建议迁移到现代安全机制。

JEP 490:ZGC 非分代模式移除​

  • ZGC 仅保留分代模式,非分代模式被移除。
  • 简化 ZGC 代码和维护,提升性能。

JEP 479:移除 Windows 32 位 x86 支持​

  • 移除 JDK 对 Windows 32 位 x86 平台的支持,专注于 64 位架构。

JEP 501:弃用 32 位 x86 支持,准备移除​

  • 进一步标记 32 位 x86 端口为待移除,鼓励迁移到 64 位平台。

JEP 498:sun.misc.Unsafe 内存访问方法警告​

  • 首次调用 sun.misc.Unsafe 的内存访问方法时发出警告,建议迁移到 VarHandle 或 FFM API。

  • 提升安全性,减少对内部不稳定 API 的依赖。

  • 移除/废弃项:

    • 移除 Linux 下 GTK2 支持,JDK 仅支持 GTK3。
    • 移除 JNDI 远程代码下载、部分 JNDI 属性和常量。
    • 移除 java 命令的 -t、-tm、-Xfuture、-checksource、-cs、-noasyncgc 等选项。
    • 废弃 jstatd、jrunscript 工具,jdk.jsobject 模块,LockingMode 标志等。
    • java.util.zip.ZipError 标记为移除。

6. 其他重要变更与修复​

  • 支持 Unicode 16.0,字符集、正则、文本处理等全面升级。
  • Reader.of(CharSequence) 新增静态工厂方法,便于从 CharSequence 创建 Reader。
  • Process.waitFor(Duration) 新增重载方法,支持 Duration 类型超时。
  • jar 工具增强,支持 --keep-old-files、--dir 等新选项。
  • 虚拟线程调度器监控,新增 MXBean 和 jcmd 命令支持。
  • 安全属性文件支持 include 指令,便于分模块管理安全配置。
  • TLS/SSL 相关增强,如 TLSv1.3 新会话票据数量可配置、支持模式匹配禁用 Cipher Suite。
  • XML/JAXP:内置 W3C DTD/XSD,调整默认限制,增强安全性。
  • CLDR 46/时区数据库 2024b,本地化和时区数据全面更新。
  • 弃用/移除部分老旧 API 和命令行参数,详见官方文档。

7. 已知问题与修复​

  • 修复了 Windows 下 OperatingSystemMXBean CPU 负载始终返回 -1 的问题。
  • 修复了 lambda 表达式、反射、类加载等相关的若干兼容性和行为问题。
  • 详见 JDK 24 Release Notes。

本文档为 JDK 24 主要新特性与变更的详细中文说明,便于开发者快速查阅和理解。如需了解更详细的实现细节,请参考官方 JEP 页面和 Release Notes。