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 的表达能力,适合大数据、实时计算等场景。
- 示例:
// 该示例展示了如何用 Gatherer 实现窗口分组求和。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]
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 {// 在主线程作用域内设置 USERScopedValue.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包,支持多种数据类型的向量操作。 - 适合科学计算、机器学习、图像处理等高性能场景。
- 示例:
// 该示例展示了如何用 Vector API 实现高效的向量加法。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]}}
JEP 478:密钥派生函数 API(预览)
- 新增标准化的密钥派生函数(KDF)API,便于安全地从主密钥派生子密钥。
- 支持 PBKDF2、HKDF、scrypt 等主流算法,提升密码学操作的安全性和一致性。
- 示例:
// 该示例展示了如何用标准 KDF API 派生密钥并进行参数配置。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));}}
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。