Oracle Java 平台组首席架构师Mark Reinhold宣布,自JDK 17以来的下一个长期支持 (LTS) 版本JDK 21已达到初始候选版本阶段。主线源存储库于 2023 年 6 月上旬分叉到 JDK稳定存储库(Rampdown 第一阶段),定义了 JDK 21 的功能集。可以解决诸如回归或严重功能问题之类的关键错误,但必须解决这些问题。通过修复请求流程获得批准。根据发布时间表,JDK 21将于2023年9月19日正式发布。
最终的 15 个新功能集(以JEP的形式)可分为四 (4) 类:核心 Java 库、Java 语言规范、热点和安全库。
其中六 (6) 个新功能属于核心 Java 库:
其中五 (5) 个新功能属于Java 语言规范:
其中三 (3) 个新功能属于HotSpot类别:
最后,其中一 (1) 个新功能被分类在安全库下:
值得注意的是,最初针对 JDK 21 的JEP 404, Generational Shenandoah(实验性)已从 JDK 21 的最终功能集中正式删除。这是由于“审查过程中发现的风险以及缺乏时间”可以执行如此大的代码贡献所需的彻底审查。” Shenandoah 团队决定“尽其所能提供最好的 Generational Shenandoah”,并将寻求以 JDK 22 为目标。
我们研究了其中一些新功能,并包括它们在四个主要 Java 项目( Amber、Loom、Panama和Valhalla )支持下的位置,这些项目旨在孵化一系列组件,以便通过精心策划的合并最终包含在 JDK 中。
JEP 445,未命名类和实例主方法(预览),以前称为灵活主方法和匿名主类(预览)和隐式类和增强主方法(预览),提出“发展 Java 语言,以便学生可以编写自己的第一个程序,无需了解为大型程序设计的语言功能。” 此 JEP 推进了Oracle Java 语言架构师Brian Goetz于 2022 年 9 月发表的博客文章“铺平入口” 。Oracle技术人员顾问Gavin Bierman发布了规范文件初稿供 Java 社区审查。有关 JEP 445 的更多详细信息可以在 InfoQ新闻报道中找到。
JEP 440,记录模式,最终确定了此功能,并根据前两轮预览的反馈进行了增强:JEP 432,记录模式(第二次预览版),在 JDK 20 中提供;以及 JEP 405,记录模式(预览版) ,在 JDK 19 中提供。此功能通过记录模式增强了语言,以解构记录值。记录模式可以与类型模式结合使用,以“实现强大的、声明性的、可组合形式的数据导航和处理”。类型模式最近通过以下方式扩展用于switch
案例标签:JEP 420,开关模式匹配(第二次预览),在 JDK 18 中提供,以及 JEP 406,switch 的模式匹配(预览版)for
,在 JDK 17 中提供。 JEP 432 中最重要的更改删除了对出现在增强语句标头中的记录模式的支持。有关 JEP 440 的更多详细信息可以在 InfoQ新闻报道中找到。
JEP 430,字符串模板(预览) ,建议使用字符串模板(包含嵌入表达式的字符串文字)来增强 Java 编程语言,这些模板在运行时对嵌入表达式进行求值和验证。有关 JEP 430 的更多详细信息可以在 InfoQ新闻报道中找到。
JEP 453,结构化并发(预览版),针对前两轮孵化的反馈进行了增强:JEP 428,结构化并发(孵化器),在 JDK 19 中交付;以及 JEP 437,结构化并发(第二个孵化器),在 JDK 20 中交付。最近的重大更改包括:TaskHandle
接口已重命名为Subtask
修复程序,以更正方法的通用签名handleComplete()
;取消时子任务的状态和行为发生变化;currentThreadEnclosingScopes()
类中定义的新方法Threads
,返回包含当前结构化上下文描述的字符串;fork()
类中定义的方法返回StructuredTaskScope
一个实例Subtask
(以前称为TaskHandle
) 而不是 a Future
,因为get()
旧接口中的方法已重构为与接口中的方法TaskHandle
具有相同的行为。有关 JEP 453 的更多详细信息可以在 InfoQ新闻报道中找到。resultNow()
Future
JEP 446,作用域值(预览版),以前称为范围局部变量(孵化器),现在是继 JDK 20 中提供的JEP 429,作用域值(孵化器)之后的预览功能。该 JEP 建议在 JDK 20 中实现不可变数据的共享并跨线程。这比线程局部变量更可取,特别是在使用大量虚拟线程时。
JEP 444,虚拟线程,建议根据前两轮预览的反馈最终确定此功能:JEP 436,虚拟线程(第二个预览版),在 JDK 20 中交付;以及 JEP 425,虚拟线程(预览版),在 JDK 19 中提供。此功能提供了虚拟线程、轻量级线程,可显着减少向 Java 平台编写、维护和观察高吞吐量并发应用程序的工作量。JEP 436 中最重要的变化是虚拟线程现在通过消除选择不使用这些变量的选项来完全支持线程局部变量。有关 JEP 444 的更多详细信息,请参阅 InfoQ新闻报道和 JEP Café截屏视频作者:José Paumard,Oracle Java 平台小组的 Java 开发者倡导者。
JEP 448,Vector API(第六孵化器),根据前五轮孵化的反馈进行了增强:JEP 438,Vector API(第五孵化器),在 JDK 20 中交付;JEP 426,Vector API(第四个孵化器),在 JDK 19 中交付;JEP 417,Vector API(第三孵化器),在 JDK 18 中交付;JEP 414,Vector API(第二孵化器),在 JDK 17 中交付;JEP 338,Vector API(孵化器) ,作为 JDK 16 中的孵化器模块提供。此功能建议增强 Vector API,以MemorySegment
按照外部函数和内存 API 的定义在 a 之间加载和存储向量。
JEP 442,外部函数和内存 API(第三次预览版),结合了基于反馈的改进,并提供了来自以下版本的第三次预览: JEP 434,外部函数和内存 API(第二次预览版),在 JDK 20 中交付;JEP 424,外部函数和内存 API(预览版),在 JDK 19 中交付,以及相关的孵化 JEP 419,外部函数和内存 API(第二孵化器),在 JDK 18 中交付;和 JEP 412,外部函数和内存 API(孵化器),在 JDK 17 中提供。此功能为 Java 应用程序提供了一个 API,通过有效调用外部函数并安全地访问不受 JVM 管理的外部内存,可以与 Java 运行时之外的代码和数据进行互操作。JEP 434 的更新包括: 集中管理接口中原生段的生命周期Arena
;使用新元素增强布局路径以取消引用地址布局;并删除该类VaList
。
开发人员可能有兴趣了解外部函数和内存 API 的性能优势,该 API 计划成为 JDK 22 中的最终功能。Oracle技术人员顾问成员Per-Åke Minborg发表了这篇博客文章,其中他与使用旧的 Java 本机接口 (JNI) 调用相比,为 JDK 21 (JEP 442) 和 JDK 22 (JEP Draft 8310626) 提供了使用此 API 进行字符串转换的基准。
JEP 439(Generational ZGC)提出“通过扩展 Z 垃圾收集器 (ZGC) 来为年轻对象和老对象维护不同的世代,从而提高应用程序性能。这将允许 ZGC 更频繁地收集年轻对象,这些对象往往会在年轻时就死亡。” 有关 JEP 439 的更多详细信息可以在 InfoQ新闻报道中找到。
计划于 2024 年 3 月发布 GA,目前JDK 22没有目标 JEP 。然而,根据一些 JEP 候选者和草案,特别是那些已经提交的草案,我们可以推测哪些额外的 JEP 有可能包含在 JDK 22 中。
JEP 447,Super() 之前的语句,在Project Amber的支持下,建议:允许不引用正在创建的实例的语句出现在构造函数中的this()
or调用之前;super()
并保留构造函数现有的安全性和初始化保证。Oracle 技术人员顾问成员Gavin Bierman提供了此 JEP 的初始规范,供 Java 社区审查并提供反馈。
JEP 435,异步堆栈跟踪 VM API,一种功能 JEP 类型,建议定义一个高效的 API,用于获取异步调用跟踪,以便从带有 Java 和本机帧信息的信号处理程序进行分析。
JEP 401,空限制值对象存储(预览版),以前称为原始类(预览版),在 Valhalla 项目的支持下,引入了开发人员声明的原始类 - 由值对象 API 定义的特殊类型的值类 - 即定义新的原始类型。
JEP 草案 8307341,准备限制 JNI 的使用,建议限制本质上不安全的 Java 本机接口 (JNI) 的使用以及外部函数和内存 (FFM) API 中受限制方法的使用,该 API 预计将成为JDK 22 中的最后一个功能。从 JDK 22 开始,对齐策略将使 Java 运行时显示有关 JNI 使用的警告,除非 FFM 用户在命令行上启用不安全的本机访问。预计在 JDK 22 之后的版本中,使用 JNI 将抛出异常而不是警告。
JEP 草案 8310626,外部函数和内存 API,建议经过两轮孵化和三轮预览后最终确定此功能:JEP 412,外部函数和内存 API(孵化器),在 JDK 17 中交付;JEP 419,外部函数和内存 API(第二孵化器),在 JDK 18 中交付;JEP 424,外部函数和内存 API(预览版),在 JDK 19 中交付;JEP 434,外部函数和内存 API(第二预览版),在 JDK 20 中交付;和 JEP 442,外部函数和内存 API(第三个预览版),将在即将发布的 JDK 21 版本中提供。自上一个版本以来的改进包括:Enable-Native-Access
清单属性允许可执行 JAR 中的代码在不使用标志的情况下调用受限方法--enable-native-access
;允许客户端以编程方式构建 C 函数描述符,避免特定于平台的常量;改进了对本机内存中可变长度数组的支持;并支持本机字符串中的多个字符集。
JEP 草案 8288476,模式、instanceof 和 switch 中的原始类型(预览版),建议“通过允许在所有模式上下文中使用原始类型模式来增强模式匹配,将原始类型模式的语义与 instanceof 对齐,并将 switch 扩展到允许原始常量作为大小写标签。”
JEP 草案 8277163值对象(预览版)是Valhalla 项目支持下的 JEP 功能,建议创建值对象 - 指定其实例行为的无身份值类。该草案与 JEP 401, Primitive Classes (Preview)相关,该草案仍处于候选状态。
JEP 草案 8313278,Java 虚拟机的提前编译,建议“增强 Java 虚拟机,使其能够加载编译为本机代码的 Java 应用程序和库,以实现更快的启动和基线执行”。
JEP 草案 8312611,计算常量,引入了计算常量的概念,定义为最多初始化一次的不可变值持有者。这提供了现场的性能和安全优势final
,同时在初始化时间方面提供了更大的灵活性。此功能将作为预览API 首次亮相。
JEP 草案 8283227,JDK 源结构,一种信息性 JEP 类型,描述了 JDK 源代码以及 JDK 存储库中相关文件的总体布局和结构。该 JEP 建议帮助开发人员适应JDK 9 中提供的JEP 201(模块化源代码)中描述的源代码结构。
JEP 草案 8280389,ClassFile API,建议提供一个用于解析、生成和转换 Java 类文件的 API。该 JEP 最初将作为JDK 中ASM (Java 字节码操作和分析框架)的内部替代品,并计划将其作为公共 API 开放。Oracle 的 Java 语言架构师Brian Goetz将 ASM 描述为“带有大量遗留包袱的旧代码库”,并提供了有关该草案将如何发展并最终取代 ASM 的背景信息。
JEP 草案 8278252,JDK 打包和安装指南,一个信息性 JEP,建议为在 macOS、Linux 和 Windows 上创建 JDK 安装程序提供指南,以减少不同 JDK 提供商安装 JDK 时发生冲突的风险。目的是通过规范安装目录名称、包名称和其他可能导致冲突的安装程序元素,在安装 JDK 更新版本时提供更好的体验。
我们预计 Oracle 很快就会开始针对 JDK 22 的 JEP。