Java 24 震撼发布:开发者必备的新特性全解析!

B站影视 内地电影 2025-03-21 20:41 2

摘要:2025 年 3 月 18 日,Oracle 郑重发布了 Java 24,此乃 Java 语言发展进程中的又一座里程碑。身为 Java SE 产品管理总监的沙拉特·钱德(Sharat Chander)亲自宣告的重大版本,Java 24 携 24 项强化功能亮相

2025 年 3 月 18 日,Oracle 郑重发布了 Java 24,此乃 Java 语言发展进程中的又一座里程碑。身为 Java SE 产品管理总监的沙拉特·钱德(Sharat Chander)亲自宣告的重大版本,Java 24 携 24 项强化功能亮相,当中涵盖 8 项预览功能以及 1 项孵化器功能,涉及语言、API、性能、安全等诸多领域。本文将为您全方位解读 Java 24 的核心亮点,助力您迅速把控这一版本的关键更新。

语言改进:

模式中的原始类型、instanceof 和 switch第二预览版[JEP 488]

通过允许所有模式上下文中的原始类型以及扩展instanceof和switch使用所有原始类型来增强模式匹配。这是一项预览语言功能。

灵活的构造函数主体第三预览版[JEP 492]

在 Java 编程语言的构造函数中,允许语句出现在显式构造函数调用之前,即super(..)或this(..)。这些语句不能引用正在构造的实例,但可以初始化其字段。在调用另一个构造函数之前初始化字段可以使类在方法被重写时更加可靠。这是预览语言功能。

模块导入声明第二预览版[JEP 494]

增强了 Java 编程语言,使其能够简洁地导入模块导出的所有包。这简化了模块库的重用,但不需要将导入代码放在模块本身中。这是一项预览语言功能。

简单源文件和实例主要方法第四版预览[JEP 495]

改进 Java 编程语言,让初学者无需了解为大型程序设计的语言功能即可编写他们的第一个程序。初学者无需使用单独的语言方言,而是可以为单类程序编写精简的声明,然后随着技能的增长无缝扩展他们的程序以使用更高级的功能。经验丰富的开发人员同样可以享受简洁地编写小型程序的乐趣,而无需为大型编程而设计的结构。这是一项预览语言功能。

图书馆

流收集器 [JEP 485]

增强了Stream API,以支持自定义中间操作。这将允许流管道以现有内置中间操作难以实现的方式转换数据。

类文件 API [JEP 484]

提供用于解析、生成和转换 Java 类文件的标准 API。

Scoped Values第 4 预览版[JEP 487]

引入了作用域值,它使方法能够与线程内的调用方以及子线程共享不可变数据。作用域值比线程局部变量更容易推理。它们还具有较低的空间和时间成本,尤其是与虚拟线程 ( JEP 444 ) 和结构化并发 ( JEP 480 ) 一起使用时。这是一个预览 API。

Vector API第 9 孵化器[JEP 489]

引入一种 API 来表达矢量计算,该计算在运行时可靠地编译为受支持的 CPU 架构上的最佳矢量指令,从而实现优于等效标量计算的性能。

结构化并发第四个预览版[JEP 499]

通过引入结构化并发 API 简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和取消、提高可靠性并增强可观察性。这是一个预览 API。

性能和运行时

紧凑对象头实验[JEP 450]

将 HotSpot JVM 中的对象头大小从 96 到 128 位减少到 64 位架构上的 64 位。这将减少堆大小、提高部署密度并增加数据局部性。

G1 的后期屏障扩展 [JEP 475]

通过将 G1 垃圾收集器屏障的扩展从 C2 JIT 编译管道的早期移到后期,简化了 G1 垃圾收集器屏障的实现,这些屏障记录有关应用程序内存访问的信息。

提前类加载和链接 [JEP 483]

当 HotSpot Java 虚拟机启动时,通过使应用程序的类在加载和链接状态下立即可用来缩短启动时间。通过在一次运行期间监视应用程序并将所有类的加载和链接形式存储在缓存中以供后续运行使用来实现这一点。为将来改进启动和预热时间奠定基础。

ZGC:删除非分代模式 [JEP 490]

删除 Z 垃圾收集器 (ZGC) 的非分代模式,保留分代模式作为 ZGC 的默认模式。

无需固定即可同步虚拟线程 [JEP 491]

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

安全库

密钥派生函数 API预览[JEP 478]

引入密钥派生函数 (KDF) API,这是一种用于从密钥和其他数据派生附加密钥的加密算法。这是一个预览 API。

基于抗量子模块格的密钥封装机制 [JEP 496]

通过提供抗量子的基于模块格的密钥封装机制 (ML-KEM) 的实现来增强 Java 应用程序的安全性。密钥封装机制 (KEM) 用于通过公钥加密技术保护不安全通信通道上的对称密钥。ML-KEM 旨在抵御未来的量子计算攻击。它已由美国国家标准与技术研究院 (NIST) 在FIPS 203中进行了标准化。

基于模块格的抗量子数字签名算法 [JEP 497]

通过提供抗量子的基于模块格的数字签名算法 (ML-DSA) 的实现来增强 Java 应用程序的安全性。数字签名用于检测对数据的未经授权的修改并验证签名者的身份。ML-DSA 旨在抵御未来的量子计算攻击。它已由美国国家标准与技术研究所 (NIST) 在FIPS 204中进行了标准化。

源代码(不会影响 JDK 二进制文件)

分代 Shenandoah(实验性)[JEP 404]

通过实验性的分代收集功能增强Shenandoah 垃圾收集器,以提高可持续吞吐量、负载峰值恢复能力和内存利用率。

无需 JMOD 即可链接运行时图像 [JEP 493]

通过启用该工具来创建自定义运行时映像而不使用 JDK 的 JMOD 文件,可将 JDK 的大小减少约 25% jlink。在构建 JDK 时必须启用此功能;默认情况下不会启用此功能,并且某些 JDK 供应商可能选择不启用它。

维护和清理

准备限制 JNI 的使用 [JEP 472]

发出有关使用Java 本机接口 (JNI)的警告,并调整外部函数和内存 (FFM) API以一致的方式发出警告。所有此类警告旨在帮助开发者为未来版本做好准备,该版本通过统一限制 JNI 和 FFM API来默认确保完整性。应用开发者可以通过在必要时选择性地启用这些接口来避免当前警告和未来限制。

删除 Windows 32 位 x86 端口 [JEP 479]

删除对 Windows 32 位 x86 端口的源代码和构建支持。此端口已在 JDK 21 中弃用并被删除,并明确打算在未来版本中将其删除。

永久禁用安全管理器 [JEP 486]

多年来,安全管理器一直不是保护客户端 Java 代码的主要手段,它很少用于保护服务器端代码,而且维护成本高昂。因此,我们已弃用它,并在 Java 17 中通过JEP 411 (2021) 将其删除。作为删除安全管理器的下一步,我们将修改 Java 平台规范,以便开发人员无法启用它,并且其他平台类不会引用它。此更改不会对绝大多数应用程序、库和工具产生影响。我们将在未来的版本中删除安全管理器 API。

在 sun.misc.Unsafe 中使用内存访问方法时发出警告 [JEP 498]

首次调用任何内存访问方法时,在运行时发出警告sun.misc.Unsafe。所有这些不受支持的方法在 JDK 23 中都已弃用。它们已被标准 API 取代,即 VarHandle API(JEP 193,JDK 9)和外部函数和内存 API(JEP 454,JDK 22)。我们强烈建议库开发人员从 迁移sun.misc.Unsafe到受支持的替代方案,以便应用程序可以顺利迁移到现代 JDK 版本。

弃用 32 位 x86 端口并将其删除 [JEP 501]

弃用 32 位 x86 端口,并计划在将来的版本中将其删除。这将弃用 Linux 32 位 x86 端口,这是 JDK 中唯一剩下的 32 位 x86 端口。它还将有效地弃用任何剩余的下游 32 位 x86 端口。在删除 32 位 x86 端口后,与架构无关的 Zero 端口将成为在 32 位 x86 处理器上运行 Java 程序的唯一方式。

关于预览和孵化器功能的提醒

预览功能是 Java SE 平台的语言或 VM 功能的完整指定和完整实现,但并非永久不变。它们在 JDK 功能版本中可用,以便开发人员根据实际使用情况提供反馈,然后在未来的版本中成为永久功能。这也为工具供应商提供了在功能最终纳入 Java SE 标准之前努力支持这些功能的机会。孵化器模块中的 API将非最终 API 和非最终工具交到开发人员和用户手中,以便我们收集反馈,最终提高 Java 平台的质量。

其他变化

除了 JEP 中描述的变更之外,发行说明中还列出了许多较小的变更,这些变更将引起许多应用程序开发人员和系统管理员的兴趣。这些变更包括弃用过时的 API 和删除以前弃用的 API。

安全库/javax.net.ssl

新的系统属性jdk.tls.server.newSessionTicket可设置 JSSE 服务器每个会话发送的 TLSv1.3 恢复票证数量。可以使用 命令行进行设置-Djdk.tls.server.newSessionTicket=#,#范围为 0 到 10。默认值为 1。

安全库/javax.net.ssl

jdk.tls.disabledAlgorithms可以使用配置文件中的 security 属性java.security使用一个或多个“ ”通配符禁用 TLS 密码套件。例如,“TLS_RSA_ ”禁用所有以“TLS_RSA_”开头的密码套件。只有以“TLS_”开头的密码套件才允许使用通配符。

使用 jar 工具将 JAR 文件提取到特定目录的新选项 (JDK-8173970)

工具/jar

该jar工具的提取操作已得到增强,允许使用--dir或-C选项来指定将提取档案的目录。

用法示例:

jar -xf foo.jar -C /tmp/bar/

或者

jar --extract --file foo.jar --dir /tmp/bar/

这两个命令都会将文件提取foo.jar到/tmp/bar目录中。

新的 Reader.of(CharSequence) 方法(JDK-8341566)

核心库/java.io

java.io.Reader.of(CharSequence)添加了静态工厂方法来获取Reader从 读取字符的CharSequence,String和StringBuilder是 的示例CharSequence。在某些情况下,返回的Reader比使用 更有效java.io.StringReader,因为后者需要转换为String和同步。

核心库/java.lang

添加了新的重载方法。现有的超时方法需要原始超时值及其单位。新方法使用 ,以便用户不会与单位混淆。java.lang.Process#waitFor(Duration)waitForjava.time.Duration

核心库/java.lang

此版本将 Unicode 版本升级到 16.0,其中包括 Unicode 字符数据库和 Unicode 标准附件 #9、#15 和 #29 的更新版本:

该java.lang.Character课程支持 Unicode 字符数据库,该数据库添加了 5,185 个字符,总共 154,998 个字符。新增内容包括七种新文字:Garay 是一种来自西非的现代文字。Gurung Khema、Kirat Rai、Ol Onal 和 Sunuwar 是印度东北部和尼泊尔的四种现代使用的文字。托德里语是阿尔巴尼亚语使用的一种历史文字。Tulu-Tigalari 是一种来自印度西南部的历史文字。和java.text.Bidi类java.text.Normalizer分别支持 Unicode 标准附件 #9 和 #15。该java.util.regex包支持基于 Unicode 标准附件 #29 的扩展字素簇。

有关 Unicode 16.0 的更多详细信息,请参阅Unicode 联盟的发布说明。

核心库/java.util.jar

该jar工具的提取操作已得到增强,允许使用--keep-old-files和-k选项来防止覆盖现有文件。

例子:

jar xkf foo.jar

或者

jar --extract --keep-old-files --file foo.jar

这两个命令都将提取 的内容foo.jar。如果目标目录中已存在同名条目,则不会覆盖现有文件。

核心服务/java.lang.管理

添加了一个新的、特定于 JDK 的监控和管理接口jdk.management.VirtualThreadSchedulerMXBean,以允许基于 Java 管理扩展 (JMX) 的工具监控和管理虚拟线程调度程序。该接口支持监控虚拟线程调度程序的目标并行度、调度程序使用的线程以及排队到调度程序的虚拟线程数。它还支持动态更改调度程序的目标并行度。

新的 jcmd 命令 Thread.vthread_scheduler 和 Thread.vthread_pollers(JDK-8337199)

核心服务/工具

命令行工具中添加了两个命令,jcmd用于打印在诊断虚拟线程问题时可能有用的信息。

jcmd

Thread.vthread_scheduler打印虚拟线程调度程序、目标并行度、线程数和其他有用的计数器。输出还包括支持虚拟线程执行定时操作的延迟任务调度程序。

jcmd

Thread.vthread_pollers打印支持虚拟线程执行阻塞网络 I/O 操作的 I/O 轮询器。

安全库

安全属性文件java.security以及系统属性所引用的文件java.security.properties现在支持包含其他属性文件。 指令可用于此目的。 包含文件的效果相当于在包含点内联定义其属性。 请参阅《安全开发人员指南》的安全属性文件包含部分和JDK-8319333include

中的更多信息和示例。

由于此更改,该名称include不再可用于定义安全属性文件中的属性。如果include将该名称传递给java.security.Security::getProperty或::setPropertyAPI,IllegalArgumentException则会抛出。

安全库/java.security

Java 安全标准算法名称规范中新增了算法名称部分PSSParameterSpec。此部分列出了在使用对象初始化 RSASSA-PSS 签名时可以指定的标准哈希和消息生成函数 (MGF) 算法PSSParameterSpec。

安全库/javax.crypto:pkcs11

SunPKCS11 提供程序已得到增强,可支持以下Cipher服务类型的 AES CTS 转换:

AES/CTS/无填充AES_128/CTS/无填充AES_192/CTS/无填充AES_256/CTS/无填充

NIST 特别出版物 800-38A 的附录定义了 CBC 模式的三种密文窃取变体:CBC-CS1、CBC-CS2 和 CBC-CS3。为确保与使用 CS3 变体的 SunJCE 和 Kerberos 的互操作性,SunPKCS11 提供程序需要知道底层 PKCS #11 库实现的变体,并在数据不在 CS3 变体中时进行转换。引入cipherTextStealingVariant了一个名为的新 SunPKCS11 提供程序配置属性,必须将其设置为以下任意值:CS1、CS2或CS3,以指示底层 PKCS #11 库的 CTS 变体。NSS 存在例外,因为它已知为CS1。否则,PKCS #11CKM_AES_CTS机制将被禁用。

工具/javadoc(工具)

API 文档包含一个新的摘要页面,其中列出了 Java SE 和 JDK API 引用的外部规范。您可以在 API 文档导航栏中链接的索引页面中找到指向新摘要页面的链接。

jpackage 在 Windows 上支持 WiX Toolset v4 和 v5(JDK-8319457)

工具/jpackage

jpackage在 Windows 上,除了 v3 之外,还可以使用 WiX Toolset v4 和 v5。它会自动选择最新安装的版本。

jpackage支持 WiX v3 和 v4 格式的自定义 WiX 源。如果使用 WiX Toolset v4 或 v5,jpackage将自动将 WiX v3 格式的自定义 WiX 源转换为 WiX v4 格式。

最后,与所有功能版本一样,JDK 23 包含数百项性能、稳定性和安全更新,包括适应底层操作系统和固件更新和标准。用户和应用程序开发人员通常会在不知不觉中受益于这些更改,但可以在OpenJDK 问题跟踪器中找到有关每个更改的信息。

所有 JDK 版本都包含一个不变的特性:可预测性

JDK 24 是按时发布的第 15 个功能版本,发布周期为六个月。这种可预测性使开发人员能够通过持续不断的改进轻松管理创新的采用。

Java 提升性能、稳定性和安全性的能力使其成为世界上最受欢迎的编程语言。

Java 24 并不是一个LTS(Long-Term Support,长期支持版)长期支持的版本,将提供更新直到 2025 年 9 月,届时它将被 Oracle JDK 25 取代。 上一个长期支持的版本是 Java 21,而下一个长期支持的版本是Java 25,如果是生产项目的话并不建议 大家现在升级,期待java25吧~


官网发布地址:https://blogs.oracle.com/java/post/the-arrival-of-java-24
Java 24 官网下载地址:https://www.oracle.com/cn/java/technologies/downloads/

完整特性参考:https://openjdk.org/projects/jdk/24/

来源:雷霆战神王

相关推荐