Java 20 已发布!

在 Twitter 上关注 JavaOpenJDK

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

Chart showing number of features per release since Java 8

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


JDK 20 现已发布!

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

Oracle JDK 20 不是长期支持 (LTS) 版本,因此它只会在六个月后被 JDK 21 取代之前接收更新

Oracle JDK 17(发布 于 2021 年 9 月 14 日)是 2018 年宣布的发布节奏下的最新长期支持 (LTS)。Oracle 宣布计划将 LTS 版本之间的间隔从三年缩短至两年,因此 JDK 21(2023 年 9 月)计划成为下一个 LTS


Java 20,携手共进

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

JDK 20 修复比例

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

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

在 Java 11 至 Java 20 GA 时标记为已修复的 21,604 个 JIRA 问题中,15,420 个由 Oracle 员工完成,而 6,184 个由个人开发者和为其他组织工作的开发者贡献。查看这些问题并从受让人处整理组织数据,得到以下图表,显示赞助 Java 中贡献开发的组织

Graph showing the number of fixes per organization

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

我们同样感谢审阅提议变更的众多经验丰富的开发者、试用早期访问版本并报告问题的早期采用者,以及在 OpenJDK 邮件列表中提供反馈的敬业专业人士。

以下个人在构建质量方面提供了宝贵的反馈、记录了高质量的错误,或提供了频繁的更新

  • Rick Hillegas(Apache Derby)
  • Uwe Schindler(Apache Lucene)
  • Rafael Winterhalter(Byte Buddy)
  • Yoann Rodière(Hibernate 项目)
  • Marc Hoffman(JaCoCo)
  • Lukas Eder(JOOQ)
  • Vladimir Sitnikov(AssertJ)

此外,通过 OpenJDK 质量外展 计划,我们要感谢以下 FOSS 项目和个人,他们对 Java 20 早期访问版本测试提供了出色的反馈,以帮助提高该版本的质量

  • Apache Tomcat 和 Apache Wicket(Martin Grigorov)
  • Apache Zookeeper(Enrico Olivelli)
  • MyBatis(Iwao Ave)
  • RxJava(David Karnok)
  • Spoon(Martin Wittlinger)

特别值得一提的是,我们要感谢 Rick Hillegas 和 Apache Derby 团队多年来在每个 JDK 版本的早期访问测试周期中提供的可靠且定期的反馈。


Java 20 的新增功能

除了数千项性能、稳定性和安全更新外,Java 20 还提供了数十项新功能和增强功能,其中七项增强功能非常重要,需要有自己的 JDK 增强建议 - JEP,涵盖了四个预览功能和三个孵化器功能。

一些不需要 JEP 的最重要变更包括

  • (D)TLS 密钥交换命名组
  • 为 G1 中的 Remark 和 Cleanup Pause Time 添加 GarbageCollectorMXBean
  • 在 x86_64 和 aarch64 平台上提供 ChaCha20 内在函数
  • Unicode 15.0 支持
  • 改进对 G1 并发精化线程的控制
  • 支持 CLDR 版本 42
  • 新的 JFR 事件:jdk.InitialSecurityProperty
  • 新的 JFR 事件:jdk.SecurityProviderService
  • 改进的预览 API 页面
  • 新的 jmod --compress 命令行选项
  • BreakIterator 中的音素支持
  • 将时区数据更新至 2022c
  • JavaDoc 标题中的自动生成 ID

可以在 发行说明 中找到这些和其他许多新功能的完整详细信息。

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

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

Java 20 中提供的七个 JEP 分为三类,映射到关键的长期 Java 技术项目。


Amber 项目

JEP 432 – 记录模式(第 2 次预览)

通过扩展模式匹配来表达更复杂、可组合的数据查询,从而提高开发人员的工作效率。这是通过增强 Java 编程语言中的记录模式来解构记录值来完成的。记录模式和类型模式可以嵌套,以实现强大、声明式且可组合的数据导航和处理形式。

JEP 432 涉及

  • [JDK 19] JEP 405: 记录模式(预览)
  • [JDK 20] JEP 433: switch 的模式匹配(第 4 次预览)

JEP 433 – switch 的模式匹配(第 4 次预览)

通过增强 Java 编程语言中 switch 表达式和语句的模式匹配,从而提高开发人员的工作效率。此改进允许针对多个模式测试表达式,每个模式都有一个特定操作,以便简洁且安全地表达复杂的面向数据的查询。

JEP 433 涉及

  • [JDK 19] JEP 427: switch 的模式匹配(第 3 次预览)
  • [JDK 20] JEP 432: 记录模式(第 2 次预览)


Panama 项目

JEP 434 - 外部函数和内存 API(第 2 次预览)

外部函数和内存 API 以四种独特的方式提供价值

  • 易用性 — 使用卓越的纯 Java 开发模型替换 Java Native Interface (JNI)。
  • 性能 — 提供与现有 API(如 JNI 和 `sun.misc.Unsafe`)相当甚至更好的性能。
  • 通用性 — 提供操作不同类型外部内存(例如,本机内存、持久性内存和托管堆内存)的方法,并随着时间的推移,适应其他平台(例如,32 位 x86)和用 C 以外的语言(例如,C++、Fortran)编写的外部函数。
  • 安全性 — 允许程序对外部内存执行不安全的操作,但默认情况下会警告用户此类操作。

外部函数和内存 API 引入了一个 API,通过该 API Java 程序可以与 Java 运行时之外的代码和数据进行交互。通过有效调用外部函数(即 JVM 之外的代码)并安全访问外部内存(即 JVM 不管理的内存),该 API 使 Java 程序能够调用本机库并处理本机数据,而无需 JNI 的脆弱性和危险性。

JEP 434 涉及

  • [JDK 19] JEP 424: 外部函数和内存 API(预览)

JEP 438 - 向量 API(第 5 次孵化)

通过引入一个 API 来表达向量计算,从而提高性能,该 API 可在运行时可靠地编译为受支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。向量 API 在 JDK 16 到 19 中进行了孵化。JDK 20 融入了这些版本的用户的反馈以及性能改进和实现增强。

JEP 438 涉及

  • [JDK 19] JEP 426: 向量 API(第 4 次孵化)


Loom 项目

Loom 项目旨在大幅减少编写、维护和观察高吞吐量并发应用程序的工作量,这些应用程序充分利用了可用的硬件。Loom 项目的工作始于 2017 年末,自 JDK 19 以来已产生了六个 JEP。

JEP 436 - 虚拟线程(第 2 次预览)

虚拟线程是轻量级线程,可极大地减少编写、维护和观察高吞吐量并发应用程序的工作量。

虚拟线程是 Loom 项目的一部分,作为第一个 JEP。Loom 项目升级了 Java 并发模型,以满足当今大规模服务器应用程序的需求。

Java 的线程有很多优点。它们提供了一个自然的编程模型,使用用户理解的控制流运算符(循环、条件、异常)编写可读的顺序代码。用户可以获得出色的调试和可服务性,以及可读的堆栈跟踪。而且,线程是操作系统的自然调度单元。我们希望保留这些优势。

问题在于操作系统对线程的实现过于繁重。为每个连接启动一个线程需要花费太长时间,但更糟糕的是,操作系统在任何时候可以支持的线程数限制了服务器可以处理的并发事务数——远低于硬件或网络的容量——因此线程成为服务器吞吐量的严重制约因素。

许多人认为我们会采用所谓的“响应式”框架提供的异步编程风格。通过不直接将并发操作表示为线程,它确实可以扩展到按请求分配线程模型所施加的限制之外,但代价巨大——更复杂的代码更难编写、更难阅读,并且更难调试或分析,因为所有层及其工具的平台都是围绕线程构建的。响应式可能是人们使用当前 JVM 所能做到的最好的,但我们的目标是做得更好,我们可以通过使线程更轻量级和更具可扩展性来做到这一点,让开发人员继续使用他们多年来一直成功使用的模型和工具。

如今,开发人员有三个糟糕的选择:通过利用不足浪费硬件,通过更差的编程模型和可观察性浪费程序员精力,或远离 Java。因此,Loom 项目为开发人员提供了更好的选择。

JEP 429 - 作用域值(孵化器)

作用域值支持在线程内和线程之间共享不可变数据。它们比线程局部变量更受欢迎,尤其是在使用大量虚拟线程时,并通过多种方式提供价值,包括

  • 易于使用——提供一个编程模型,以便在同一线程内和与子线程之间共享数据,从而简化对数据流的推理。
  • 可理解性——使共享数据的生命周期从代码的语法结构中可见。
  • 健壮性——确保调用者共享的数据只能由合法的被调用者检索。
  • 性能——将共享数据视为不可变数据,以便允许大量线程共享,并支持运行时优化。

JEP 437 - 结构化并发(第 2 次孵化器)

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

JEP 437 涉及

  • [JDK 19] JEP 428:结构化并发(孵化器)


资源

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

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

  • 访问 Dev.java(Oracle 专用门户,用于提升您的 Java 知识和社区参与度)。
  • 访问 Inside.java(Oracle Java 团队的新闻和观点)。
  • 收听 Inside.java 播客(一个音频节目,由 Oracle 的 Java 开发人员直接为您带来,专门针对 Java 开发人员。对话将讨论语言、JVM、OpenJDK、平台安全性、Loom 和 Panama 等创新项目,以及介于两者之间的所有内容)。
  • 观看 Inside.java 新闻播报(一个视频节目,将 Inside.java 播客扩展为视频格式)。
  • 观看 YouTube 上的 Java(Oracle 汇集的相关 Java 视频,可帮助您提升 Java 专业知识)。
  • 观看 JEP 咖啡馆(Oracle 对流行的 JDK 增强提案进行的技术探索)。
  • 加入 OpenJDK 邮件列表(了解您最喜爱的 OpenJDK 项目进展的地方)。
  • 关注 OpenJDKJava(提供 Java 持续演进的更新和新闻的社交流)。
  • 阅读 Java 杂志;Oracle 的数字 Java 出版物,提供由开发人员撰写的技术文章,面向开发人员。