JDK 24:Java 24 中的新特性

科技   2024-12-06 23:14   辽宁  

导读:Java下一个版本将有 24 个功能,包括结构化并发的第四个预览版和加密功能,旨在保护 Java 应用程序免受未来的量子计算攻击。

Java 开发工具包 (JDK) 24现处于初始缩减阶段,功能集冻结为 24 个功能,从类文件 API 到结构化并发的第四个预览版。

https://openjdk.org/projects/jdk/24/

JDK 24 于 12 月 5 日进入了减法准备阶段,将于 2025 年 3 月 18 日发布生产版本。JDK 24 拥有二十多个特性,远远超过了前身JDK 23,后者在今年的 9 月 17 日发布,官方带有 12 个新特性。


最新添加的五项内容包括使用内存访问方法的警告sun.misc.unsafe、结构化并发的第四个预览、弃用并删除 32 位 x86 端口以及通过提供基于抗量子模块格子的数字签名算法和基于抗量子模块格子的密钥封装机制的 Java 实现来提高 Java 对量子计算攻击的抵抗力。


在先前提出的功能包括灵活的构造函数主体;提前类加载与链接;删除 Windows 32 位 x86 端口;同步虚拟线程而不固定;简单的源文件和实例主方法;永久禁用安全管理器;模块导入声明;紧凑对象头的实验版本;模式、instanceof的原始类型switch;链接没有 JMOD 的运行时图像;分代 Shenandoah 垃圾收集器;范围值;密钥派生函数 API;删除垃圾收集器中的非分代模式;流收集器;矢量 API;类文件 API警告,以便开发人员为未来使用 JNI (Java 本机接口)的限制做好准备;以及 G1 垃圾收集器的后期屏障扩展。


JDK 24 已被指定为非长期支持 (LTS) 版本。(当前 LTS 版本为JDK 21,将于 2023 年 9 月发布。)与 JDK 23 一样,JDK 24 也将仅获得 Oracle 六个月的顶级支持。JDK 24 的早期访问版本可在jdk.java.net/24上找到。JDK 24 计划于明年 9 月发布下一个 LTS 版本 JDK 25。


JDK 24 的早期访问版本可在jdk.java.net上找到。 


新特性:


Windows 32 位 x86 端口已在 JDK 21 中弃用并删除,目的是在未来版本中将其删除。计划最终删除对 Windows 32 位 x86 端口的源代码和构建支持。JDK 24 将更新构建系统,以便在尝试配置 Windows 32 位 x86 (x86-32) 构建时发出错误消息。该错误消息将通过新的配置选项来抑制。端口和相关的端口特定功能将在相关文档中标记为弃用并删除。


同步虚拟线程而不固定:涉及提高使用同步方法和语句的 Java 代码的可扩展性,方法是安排在此类构造中阻塞的虚拟线程释放其底层平台以供其他线程使用。这将消除几乎所有虚拟线程被固定到平台线程的情况,这严重限制了可用于处理应用程序工作负载的虚拟线程数量。


简单源文件和实例主方法:第四个预览将改进 Java 语言,以便初学者可以编写他们的第一个程序,而无需了解为大型 程序设计的语言功能。该功能之前已在JDK 21、JDK 22和JDK 23中预览过。将采用新术语和修订后的标题,但该功能其他方面保持不变。它以前被称为隐式声明的类和实例主方法。


永久禁用安全管理器:需要修改 Java 平台规范,以便开发人员无法启用安全管理器,而其他平台类则不会引用它。提案指出,多年来,安全管理器一直不是保护客户端 Java 代码的主要手段,很少用于保护服务器端代码,而且维护成本高昂。安全管理器已在 Java 17 中被弃用并被删除。


紧凑对象头:会将 HotSpot VM 中的对象头大小从 96 到 128 位减少到 64 位架构上的 64 位。提议的功能的目标是减少堆大小、提高部署密度并增加数据局部性。


模块导入声明:(之前已在 JDK 23 中预览)增强了 Java  编程语言,使其能够简洁地导入模块导出的所有包。这简化了模块库的重用,但不需要将代码导入为模块本身。

JDK 24 中模式、 instanceof和switch中原始类型的第二个预览 将通过允许所有模式和上下文中的原始类型来增强模式匹配。该功能还将扩展instanceof和switch以适用于所有原始类型。该功能的目标包括通过允许所有类型(无论是原始类型还是引用类型)的类型模式来实现统一的数据探索;将类型与instanceof对齐并将instanceof与安全转换对齐;并允许模式匹配在嵌套和顶级模式上下文中使用原始类型。此功能之前已在  JDK 23 中预览过。

其他目标包括提供易于使用的构造,消除由于不安全的强制类型转换而丢失信息的风险,遵循 Java 5 和 Java 7 中对switch的增强,并允许switch处理任何原始类型的值。

通过链接不使用 JMOD 的运行时映像,计划通过启用jlink工具来创建不使用 JDK JMOD文件的自定义运行时映像,将 JDK 的大小减少约 25%。此功能必须默认启用,某些 JDK 供应商可能选择不启用它。目标包括允许用户从模块链接运行时映像,而不管这些模块是独立的 JMOD 文件、模块化 JAR 文件还是先前链接的运行时映像的一部分。提出该提案的动机是,在云环境中,文件系统上安装的 JDK 的大小非常重要,因为包含已安装 JDK 的容器映像会通过网络自动且频繁地从容器注册表复制。减小 JDK 的大小将提高这些操作的效率。

分代 Shenandoah将通过实验性的分代收集功能增强 垃圾收集器,以提高可持续吞吐量、负载峰值抵抗力和内存利用率。主要目标是提供一种实验性的分代模式,而不会破坏非分代 Shenandoah。分代模式旨在成为未来版本中的默认模式。

范围值使方法能够与线程内的调用方和子线程共享不可变数据。范围值比本地线程变量更容易推理。它们还具有较低的空间和时间成本,特别是与虚拟线程和结构化并发一起使用时。范围值 API 是在JDK 20中提出的孵化版,在JDK 21中提出的预览版,并针对 JDK 22和JDK 23进行了改进和完善。范围值将在 JDK 24 中预览。

借助密钥派生函数 (KDF) API,将引入用于密钥派生函数的 API,这些函数是用于从密钥和其他数据派生其他密钥的加密算法。此提案的目标是允许安全提供商以 Java 代码或本机代码实现 KDF 算法。另一个目标是使应用程序能够使用 KDF 算法,例如基于 HMAC(哈希消息认证码)的提取和扩展密钥派生函数 ( RFC 5869 ) 和 Argon2 ( RFC 9106 )。

删除 Z 垃圾收集器 (ZGC) 的非分代模式是一项旨在降低支持两种不同模式的维护成本的提案。该提案指出,维护非分代 ZGC 会减慢新功能的开发速度,而对于大多数用例而言,分代 ZGC 应该是比非分代 ZGC 更好的解决方案。后者最终应该被前者取代,以降低长期维护成本。该计划要求通过淘汰该选项ZGenerational并删除非分代 ZGC 代码及其测试来删除非分代模式。非分代模式将在未来的版本中过期,届时它将不会被 HotSpot  JVM 识别,从而拒绝启动。

流收集器将增强流 API,以支持自定义中间操作。流收集器允许流管道以现有内置中间操作无法轻易实现的方式转换数据。此功能在JDK 22和JDK 23中作为预览版提出。该 API 将在 JDK 24 中最终确定。目标包括使流管道更加灵活和富有表现力,并允许自定义中间操作来操作无限大小的流。

向量API旨在表达向量通信,这些通信在运行时可靠地编译为受支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。向量  API 之前在JDK 16到JDK 23中孵化。它将在 JDK 24 中重新孵化,没有任何 API 变化,也没有相对于 JDK 23 的实质性实现。该提案的目标包括用与平台无关的 API 清晰简洁地表达各种向量计算,在 x64 和 AArch54 架构上提供可靠的运行时编译和性能,当无法在运行时表达向量计算时可以优雅地降级并仍然运行,并与Project Valhalla保持一致,利用对 Java 对象模型的增强功能。

之前在 JDK 22 和 JDK 23 中预览过的类文件 API将 在 JDK 24 中最终确定,但会略有改动。此 API 提供了一个用于解析、生成和转换 Java 类文件的标准 API。其目的是提供一个用于处理类文件的 API,该 API 跟踪 Java 虚拟机规范定义的类文件格式。第二个目标是使 JDK 组件能够迁移到标准 API,并最终删除 JDK 内部的第三方ASM 库副本。自第二个预览版以来的更改 包括重命名枚举值、删除某些字段、添加方法和方法重载、重命名方法以及删除被认为不必要的接口和方法。

G1 垃圾收集器的后期屏障扩展旨在简化 G1 屏障的实现。G1  垃圾收集器的屏障通过将其扩展从 C2 编译管道的早期移到后期来记录有关应用程序内存访问的信息。目标包括减少使用 G1 收集器时 C2 编译的执行时间,使对 C2 缺乏深入了解的 HotSpot 开发人员能够理解 G1 屏障,并确保 C2 保留有关内存访问、安全点和屏障的相对顺序的不变量。第四个功能是保留 C2 生成的 JIT(即时)编译代码的质量(速度和大小)。

第一个针对  JDK 24 的功能,正式名称为“准备限制使用 JNI ”,要求发出有关使用 JNI 的警告,并调整JDK 22中的外部函数和内存 (FFM) API ,以一致的方式发出警告。这些警告旨在为未来版本做准备,通过统一限制 JNI 和 FFM API,默认确保完整性。该计划的目标包括将 JNI 保留为与本机代码互操作的标准方式,为默认不允许与本机代码互操作的未来版本准备 Java 生态系统,并协调 JNI 和 FFM API 的使用,以便库维护者可以从一个迁移到另一个,而无需开发人员更改命令行选项。

针对 JDK 24 的其他功能将在未来几个月内确定。潜在的 Java 24 功能包括 JDK 23 中预览的功能的进一步预览或最终版本。这些功能包括简化并发编程的结构化并发和灵活的构造函数主体,这为开发人员提供了更大的自由来表达构造函数的行为。

提前类加载(Ahead-of-time class loading)是一项旨在加速 Java 启动的功能,而字符串模板(string templates)是一项在 JDK 21 和JDK 22中预览过但从 JDK 23 中删除的功能,也可能会在 JDK 24 中推出。

最新的 LTS 版本JDK 21于 2023 年 9 月发布,预计将获得 Oracle 至少五年的 Premier 支持。下一个 LTS 版本 JDK 25 将于 2025 年 9 月发布。LTS版本主导了 Java 的采用,这意味着在用户等待 JDK 25 时,JDK 23 和 JDK 24 的采用率可能会较低。

作者:小川

参考:

https://www.jdon.com/76268.html

相关阅读:

21CTO
21CTO(21CTO.com),开发者的学习与服务平台。提供高品质文章、课程与训练营、招聘等产品。
 最新文章