Java 21 已发布!

关注 JavaOpenJDK 的 Twitter。

Oracle 荣幸地宣布 JDK 21 已正式发布。此版本是通过六个月的发布节奏按时交付的第 12 个功能版本。这种可预测性让开发者可以轻松管理他们对创新的采用,这要归功于源源不断的预期改进。

Chart showing number of features per release since Java 8

Java 提升性能、稳定性和安全性的能力使其持续成为全球最流行的编程语言。


JDK 21 现已发布!

Oracle 现为开发者、终端用户和企业提供 JDK 21

Oracle 将为 Java 21 提供至少八年的长期支持。此延长支持期让企业可以灵活地以最少的维护将应用程序保留在生产环境中更长时间,并最终按照自己的条件迁移。根据客户反馈和在 Java 生态系统中的使用情况,Oracle 还宣布,Java 11 的长期支持已延长至至少 2032 年 1 月,Oracle 将提供至少八年的支持和更新。


Java 21,共同努力

与之前的版本一样,Java 21 赞扬了 OpenJDK 社区中许多个人和组织的贡献——我们共同构建 Java!

JDK 21 修复比率

多年来,JDK 版本中的变化率基本保持不变,但在六个月的节奏下,交付生产就绪功能和改进的速度大幅提高。

与过去几年中每隔几年进行数万次修复并交付近百个 JEP(JDK 增强提案)不同,增强功能通过精简的功能版本以更可控、可预测的六个月时间表交付。这些变化范围从重要的新功能到常规维护、错误修复和文档改进的小型增强。每个更改都以 JDK 错误系统 中单个问题的一个提交来表示。

在 Java 11 至 Java 21 正式发布时标记为已修复的 24,196 个 JIRA 问题中,17,288 个是由为 Oracle 工作的人员完成的,而 6,908 个是由个人开发者和为其他组织工作的开发者贡献的。通过查看问题并从受让人处整理组织数据,可以得到以下图表,其中列出了在 Java 中赞助开发贡献的组织

Graph showing the number of fixes per organization

在 Java 21 中,在标记为已修复的 2,585 个 JIRA 问题中,1,868 个由 Oracle 完成,而 717 个由 Java 社区其他成员贡献。Oracle 要感谢为亚马逊、ARM、Azul、谷歌、华为、IBM、英特尔、中科院软件所、红帽、Rivos、SAP 和腾讯等组织工作的开发者做出的杰出贡献。我们也很感谢来自贝尔软件、龙芯等较小组织以及独立开发者的贡献,他们共同贡献了 Java 21 中 8% 的修复。

此外,通过 OpenJDK 质量外展 计划,我们要感谢以下 FOSS 项目,它们提供了对测试 Java 21 早期访问版本的有价值反馈,以帮助提高该版本的质量

  • Apache Commons
  • Apache ZooKeeper
  • AssertJ
  • BNYM Code Katas
  • Eclipse Collections
  • JUnit5
  • Karate
  • MyBatis


Java 21 中的新增功能

除了数千项性能、稳定性和安全更新之外,Java 21 还提供了数十项新功能和增强功能,其中 15 项增强功能非常重要,值得拥有自己的 JDK 增强提案 - JEP,涵盖六项预览功能和一项孵化器功能。

JEP 预览功能是 Java SE 平台的完全指定且完全实现的语言或 VM 功能;但尚未永久化。它们在 JDK 功能版本中提供,以便在它们在未来版本中永久化之前,允许开发人员根据实际用途提供反馈。这还为工具供应商提供了在功能最终确定为 Java SE 标准之前,为支持功能而努力的机会。

JEP 孵化器模块允许将非最终 API 和非最终工具交到开发人员和用户手中,以收集最终将提高 Java 平台质量的反馈。

随 Java 21 提供的 15 个 JEP 分为六个类别,映射到关键的长期 Java 技术项目和硬件支持。


Project Amber

JEP 430:字符串模板(预览)

  • JEP 目标
    • 通过轻松表达包含运行时计算值的字符串,简化 Java 程序的编写。
    • 增强混合文本和表达式的表达式的可读性,无论文本是否适合单个源代码行(如字符串文字)或跨越多个源代码行(如文本块)。
    • 通过支持模板和嵌入式表达式的验证和转换,提高从用户提供的值中组合字符串并将其传递到其他系统(例如,为数据库构建查询)的 Java 程序的安全性。
    • 通过允许 Java 库定义字符串模板中使用的格式化语法,保持灵活性。
    • 简化使用接受以非 Java 语言(例如,SQL、XML 和 JSON)编写的字符串的 API。
    • 允许从文字文本和嵌入式表达式创建非字符串值,而无需通过中间字符串表示形式。
  • 价值
    • 遵循 Project Amber 的目标,字符串模板旨在使 Java 编程语言更具可读性、可写性和可维护性。

JEP 440:记录模式

  • JEP 目标
    • 通过将模式匹配扩展到记录类的实例解构,增强 Java 编程语言,支持更复杂的数据查询。
    • 添加嵌套模式,支持更可组合的数据查询。
  • 相关
    • [JDK 19] JEP 405:记录模式(预览)
    • [JDK 20] JEP 432:记录模式(第二次预览)
  • 价值
    • 通过将模式匹配扩展到表达更复杂、可组合的数据查询,使 Java 编程语言更具生产力。

JEP 441:用于 switch 的模式匹配

  • JEP 目标
    • 通过允许模式出现在 case 标签中,扩展 switch 表达式和语句的表现力和适用性。
  • 允许在需要时放松 switch 的历史 null 敌意。
    • 通过要求模式 switch 语句涵盖所有可能的输入值,提高 switch 语句的安全性。
    • 确保所有现有的 switch 表达式和语句继续编译,且执行语义相同。
  • 相关
    • [JDK 17] JEP 406:用于 switch 的模式匹配(预览)
    • [JDK 18] JEP 420:用于 switch 的模式匹配(第 2 次预览)
    • [JDK 19] JEP 427:用于 switch 的模式匹配(第 3 次预览)
    • [JDK 20] JEP 433:用于 switch 的模式匹配(第 4 次预览)
  • 价值
    • 通过使 Java 编程语言更具语义性来提高其生产力,以便可以简洁且安全地表达复杂的数据导向查询。

JEP 443:未命名模式和变量(预览)

  • JEP 目标
    • 使用未命名模式增强 Java 语言,该模式匹配记录组件而不说明组件的名称或类型,以及未命名变量,该变量可以初始化但不能使用。两者都用下划线字符 _ 表示。
  • 价值
    • 通过省略不必要的嵌套模式来提高记录模式的可读性。
    • 通过识别必须声明(例如,在 catch 子句中)但不会使用的变量来提高所有代码的可维护性。

JEP 445:未命名类和实例主方法(预览)

  • JEP 目标
    • 为 Java 提供平稳的入门途径,以便教育工作者可以逐步引入编程概念。
    • 帮助学生以简洁的方式编写基本程序,并在他们的技能增长时优雅地扩展他们的代码。
    • 减少编写简单程序(例如脚本和命令行实用程序)的繁琐性。
    • 不引入单独的 Java 初学者方言。
    • 不引入单独的初学者工具链;学生程序应该使用编译和运行任何 Java 程序的相同工具进行编译和运行。
  • 价值
    • 通过减少样板和繁琐性来发展 Java 语言,以便学生可以在不需要了解为大型程序设计的语言特性情况下编写他们的第一个程序。


Project Loom

JEP 444:虚拟线程

  • JEP 目标
    • 使以简单的每个请求一个线程的风格编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展。
    • 使使用 java.lang.Thread API 的现有代码能够以最小的更改采用虚拟线程。
    • 使用现有的 JDK 工具轻松对虚拟线程进行故障排除、调试和分析。
  • 相关内容
    • [JDK 20] JEP 436:虚拟线程(第 2 次预览)
    • [JDK 19] JEP 425:虚拟线程(预览)
  • 价值
    • 通过引入虚拟线程,加速应用程序开发效率,例如针对云环境的应用程序,虚拟线程是轻量级线程,极大地减少了编写、维护和观察高吞吐量并发应用程序的工作量。

JEP 446:作用域值(预览)

  • JEP 目标
    • 支持在线程内部和线程之间共享不可变数据。
  • 相关
    • [JDK 20] JEP 429:作用域值(孵化器)
  • 价值
    • 易用性——提供一个编程模型,在单个线程内和子线程之间共享数据,从而简化对数据流的推理。
    • 可理解性——从代码的语法结构中使共享数据的生命周期可见。
    • 健壮性——确保调用者共享的数据只能由合法的被调用者检索。
    • 性能——将共享数据视为不可变数据,以便允许大量线程共享,并启用运行时优化。

JEP 453:结构化并发(预览)

  • JEP 目标
    • 通过引入用于结构化并发的 API 来简化并发编程。
    • 推广一种并发编程风格,可以消除取消和关闭带来的常见风险,例如线程泄漏和取消延迟。
    • 提高并发代码的可观察性。
  • 相关
    • [JDK 19] JEP 428:结构化并发(孵化器)
    • [JDK 20] JEP 437:结构化并发(第 2 个孵化器)
  • 价值
    • 通过引入结构化并发 API 简化并发编程,该 API 简化了错误处理和取消,提高了可靠性并增强了可观察性。


Project Panama

JEP 442:外部函数和内存 API(第 3 个预览版)

  • JEP 目标
    • 引入一个 API,通过该 API,Java 程序可以与 Java 运行时之外的代码和数据进行交互。通过有效调用外部函数(即 JVM 外部的代码)和安全访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本机库和处理本机数据,而不会出现 JNI 的脆弱性和危险性。这是一个预览版 API。
  • 相关
    • [JDK 19] JEP 424:外部函数和内存 API(预览版)
    • [JDK 20] JEP 434:外部函数和内存 API(第 2 个预览版)
  • 价值
    • 易用性 — 使用卓越的纯 Java 开发模型替换 Java Native Interface (JNI)。
    • 性能 — 提供与 JNI 和 sun.misc.Unsafe 等现有 API 相当甚至更好的性能。
    • 通用性 — 提供了操作不同类型的外部内存(例如本机内存、持久性内存和托管堆内存)的方法,并随着时间的推移,可以适应其他平台(例如 32 位 x86)和用 C 以外的语言(例如 C++、Fortran)编写的外部函数。
    • 安全性 — 允许程序对外部内存执行不安全操作,但默认情况下会警告用户此类操作。

JEP 448:矢量 API(第 6 个孵化器)

  • JEP 目标
    • 引入一个 API 来表示矢量计算,该计算在运行时可靠地编译为受支持 CPU 架构上的最佳矢量指令,从而实现优于等效标量计算的性能。
    • 包括以下显着更改
      • 向矢量掩码添加异或 (xor) 操作。
      • 提高矢量改组的性能,尤其是在用于重新排列矢量元素以及在矢量之间转换时。
  • 相关
    • [JDK 16] JEP 338:矢量 API(孵化器)
    • [JDK 17] JEP 414:矢量 API(第 2 个孵化器)
    • [JDK 18] JEP 417:矢量 API(第 3 个孵化器)
    • [JDK 19] JEP 426:矢量 API(第 4 个孵化器)
    • [JDK 20] JEP 438:矢量 API(第 5 个孵化器)
  • 价值
    • 提供一个清晰简洁的 API,能够清晰简洁地表示由循环中组合的矢量操作序列组成的各种矢量计算,并且可能带有控制流
    • API 应与 CPU 架构无关,从而可以在支持矢量指令的多个架构上实现。
    • 在 x64 和 AArch64 架构上提供可靠的运行时编译和性能。
    • Project Valhalla 保持一致。


核心库

JEP 431:顺序集合

  • JEP 目标
    • 引入新的接口来表示具有定义的遭遇顺序的集合。每个此类集合都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。
    • 提供统一的 API 来访问其第一个和最后一个元素,以及以相反的顺序处理其元素。
  • 价值
    • 通过提供一组统一的操作来提高开发人员的工作效率,这些操作适用于表示具有定义的遭遇顺序的元素序列的集合类型。


性能更新

JEP 439:代际 ZGC

  • JEP 目标
    • 通过扩展 Z 垃圾收集器 (ZGC) 来维护针对年轻对象和旧对象的单独 ,从而提高应用程序性能。
  • 价值
    • 使用代际 ZGC 运行的应用程序应享有
      • 更低的分配中断风险。
      • 更低的所需堆内存开销。
      • 更低的垃圾收集 CPU 开销。
    • 与非代际 ZGC 相比,这些好处应不会导致吞吐量显着降低。应保留非代际 ZGC 的基本特性
    • 暂停时间不应超过 1 毫秒。
    • 应支持从几百兆字节到多太字节的堆大小。
    • 应尽量减少手动配置。

JEP 452:密钥封装机制 API

  • JEP 目标
    • 引入密钥封装机制 (KEM) 的 API,这是一种使用公钥密码术保护对称密钥的加密技术。
  • 价值
    • 使应用程序能够使用 KEM 算法,例如 RSA 密钥封装机制 (RSA-KEM)、椭圆曲线集成加密方案 (ECIES) 和国家标准与技术研究院 (NIST) 后量子密码标准化流程的候选 KEM 算法。
    • 支持在更高层协议(例如传输层安全性 (TLS))和密码方案(例如混合公钥加密 (HPKE,RFC 9180))中使用 KEM。
    • 允许安全提供程序在 Java 代码或本机代码中实现 KEM 算法。
    • 包括 RFC 9180 §4.1 中定义的迪菲-赫尔曼 KEM (DHKEM) 的实现。


维护和弃用

JEP 449:弃用 Windows 32 位 x86 端口以进行移除

  • JEP 目标
    • 弃用 Windows 32 位 x86 端口,并打算在未来的版本中将其移除。
  • 价值
    • 更新构建系统,以便在尝试为 Windows 32 位 x86 (x86-32) 配置构建时发出错误消息。可以通过新的配置选项抑制错误消息。
    • 在相关文档中将该端口和相关的特定端口功能标记为已弃用以进行移除。

JEP 451:准备禁止动态加载代理

  • JEP 目标
    • 在代理动态加载到正在运行的 JVM 中时发出警告。这些警告旨在为未来的版本做好准备,该版本默认禁止动态加载代理,以便 默认情况下提高完整性。在启动时加载代理的可维护性工具不会在任何版本中导致发出警告。
  • 价值
    • 准备 JDK 的未来版本,该版本默认情况下将禁止将代理加载到正在运行的 JVM 中。
    • 重新评估可维护性(包括对正在运行的代码进行临时更改)和完整性(假设正在运行的代码不会被任意更改)之间的平衡。
    • 确保大多数工具(不需要动态加载代理)不受影响。
    • 将动态加载代理的能力与其他所谓的“超级能力”,例如深度反射保持一致。


资源

Java 仍然是当今技术趋势的首选编程语言。正如 Java 20 按时交付改进所展示的那样,通过持续的周密规划和生态系统参与,Java 平台已做好准备,可以在云中进行现代开发和增长。

通过以下方式继续了解最新消息和更新

  • 访问Dev.java(Oracle 专用的门户,用于提升您的 Java 知识和社区参与)。
  • 访问Inside.java(Oracle Java 团队的新闻和观点)。
  • 收听Inside.java 播客(由 Oracle Java 团队直接为您带来的 Java 开发人员音频节目。对话将讨论语言、JVM、OpenJDK、平台安全性、Loom 和 Panama 等创新项目,以及介于两者之间的所有内容)。
  • 观看YouTube 上的 Java(Oracle 相关 Java 视频集合,可帮助您提升 Java 专业知识)。
  • 观看Inside.java 新闻播报(涵盖 OpenJDK 社区近期发展的视频节目。)
  • 观看JEP Café(Oracle 对流行的 JDK 增强提案的技术探索)。
  • 观看Sip of Java(Oracle 的短视频,介绍鲜为人知的 Java 增强功能)。
  • 加入OpenJDK 邮件列表(了解您最喜爱的 OpenJDK 项目进展的地方)。
  • 关注OpenJDKJava(提供 Java 持续演进更新和新闻的社交流)。