Java 开发工具包19(JDK 19)将于今年 9 月发布,现已功能完善,目前处于第二阶段。该版本的七项功能包括结构化并发、记录模式、外部函数和内存 API 的预览,以及对开源 Linux/RISC-V 指令集架构 (ISA) 的支持。
JDK 19的特点包括:
结构化并发,处于孵化器阶段,旨在通过结构化并发 API 简化多线程编程。这种并发性将在不同线程中运行的多个任务视为一个工作单元。
可以嵌套记录模式和类型模式,以实现声明性、强大且可组合的数据导航和处理形式。该提案的目标包括扩展模式匹配以表达更复杂、可组合的数据查询,同时不改变类型模式的语法或语义。该提案基于 2021 年 3 月在 JDK 16 中交付的 instanceof 的模式匹配。未来的计划可能要求使用数组模式和可变参数模式等功能扩展记录模式。记录模式是 Project Amber 的一部分,旨在探索和孵化更小的、面向生产力的 Java 特性。
一个外部函数和内存 API 的预览,它将引入一个 API,Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即 JVM 之外的代码)和安全地访问外部内存(即不受 JVM 管理的内存),API 使 Java 程序能够调用本地库和处理本地数据,而没有Java本地接口(JNI)的危险和脆弱性。外部函数和内存 API 结合了两个早期孵化的 API:外部内存访问 API 和外部链接器 API。外部函数和内存 API 之前在 JDK 17 中孵化并在 JDK 18 中重新孵化。该提案的目标包括易用性、性能、通用性和安全性。
目标包括使以简单的每请求线程样式编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展,使使用 java.lang 线程 API 的现有代码能够以最小的更改采用虚拟线程,并启用故障排除、调试和 使用现有 JDK 工具分析虚拟线程。本提案的目标不是更改 Java 中的基本并发模型或在 Java 语言或 Java 库中提供新的数据并行结构。删除传统的线程实现或静默迁移现有应用程序以使用虚拟线程也不是目标。
每个模式都有特定的操作,因此可以简洁安全地表达面向数据的复杂查询。此功能之前在 JDK 17 和 JDK 18 中进行了预览。第三次预览将添加改进,包括用 switch 块中的 when 子句替换受保护的模式。此外,当选择器表达式的值为null时,模式切换的运行时语义与传统切换语义更加一致。该计划的目标包括通过允许模式出现在案例标签中来扩展 switch 表达式和语句的表现力和适用性。其他目标包括允许开发人员在需要时放松 switch 的历史性空敌意,提高 switch 语句的安全性,并确保现有的 switch 表达式和语句继续编译而无需更改并以相同的语义执行。
从而实现优于等效标量计算的性能。使用 API 的开发人员获得了一种在 Java 中编写复杂矢量算法的方法,使用 HotSpot 自动矢量化器,但使用的用户模型使矢量化更加可预测和健壮。矢量 API 之前被孵化到 JDK 16、JDK 17 和 JDK 19 中。
对 JDK 19 提出的 API 的改进包括对 MemorySegments 加载和存储向量的增强,正如 外部函数和内存API预览所定义的那样。JDK 19 还将添加两个跨通道向量操作,压缩和扩展,以及一个互补向量掩码压缩操作。压缩向量操作将由掩码选择的源向量的通道按通道顺序映射到目标向量,而扩展操作则相反。压缩操作在过滤查询结果时很有用。
在向量 API 的另一个补充中,将扩展逐位积分通道操作,包括计算一个位的数量、反转位的顺序以及压缩和扩展位等操作。API 的目标包括清晰简洁、与平台无关、在 x64 和 AArch64 架构上具有可靠的运行时和编译性能,以及启用“优雅”降级,以应对向量计算在运行时无法完全表示为一系列 矢量运算。
通过 Linux/RISC-V 移植,Java 将获得对硬件指令集的支持,该指令集已被广泛的语言工具链支持。RISC-V 实际上是一系列相关的 ISA。Linux/RISC-V 端口仅支持 RISC-V 的 RV64GV 配置,RISC-V 是一种包含矢量指令的通用 64 位 ISA。Java 的开发者将来可能会考虑其他 RISC-V 配置。
该端口将支持以下 HotSpot VM 选项:模板解释器、C1(客户端)JIT 编译器、C2(服务器)JIT 编译器,以及包括 ZGC 和 Shenandoah 在内的所有当前主线垃圾收集器。实际移植几乎完成; JDK 增强提案 (JEP) 的重点是将端口集成到 JDK 主线存储库中。
与 JDK 18 一样,JDK 19 将是一个短期版本,只有六个月的顶级 Premier 支持。之前的版本 JDK 17 是一个长期支持 (LTS) 版本,提供了数年的支持。