热门排行
简介
Java 21 / JDK 21 已正式发布了,这是继 JDK 17 后的长期支持版本 (LTS),此版本带来了备受关注和瞩目的Virtual Threads,就是虚拟线程功能,根据官方介绍,虚拟线程的出现,确实是开启了并发编程的新纪元,轻量且高效,用更少的开销,处理更多的任务。
Java SE Development Kit(jdk) 21 Windows正式版:点击下载
Oracle 将为其提供至少八年的技术支持和更新。
根据 Oracle 免费条款和条件 (NFTC),JDK 21 二进制文件可在生产中免费使用,也可免费再分发。
JDK 21 将根据 NFTC 接受更新,直至 2026 年 9 月,即下一个 LTS 发布一年后。JDK 21 的后续更新将根据 Java SE OTN License (OTN) 授权,超出 OTN License 有限免费授权范围的生产使用将需要付费。
正式稳定功能
JEP 444:虚拟线程
JEP 431:序列集合
JEP 440:记录模式
JEP 441:switch 模式匹配
JEP 439:分代 ZGC
JEP 449:弃用 Windows 32 位 x86 移植
JEP 451:准备禁止动态加载代理
JEP 452:密钥封装机制 API
预览阶段功能
JEP 442:外部函数和内存 API(第三次预览)
JEP 446:作用域值(预览)
JEP 453:结构化并发(预览)
JEP 430:字符串模板(预览)
JEP 443:未命名模式和变量(预览)
JEP 445:未命名类和实例主方法(预览)
孵化阶段功能
JEP 448:Vector API(孵化器第六阶段)
主要新功能
1. 语言特点
➜ 记录模式
使用记录模式增强 Java 编程语言以解构记录值。可以嵌套记录模式和类型模式,以实现功能强大、声明性和可组合形式的数据导航和处理。
➜ 开关模式匹配
通过表达式和语句的模式匹配来增强 Java 编程语言。扩展模式匹配允许针对多个模式测试表达式,每个模式都有一个特定的操作,以便可以简洁安全地表达复杂的面向数据的查询。
1.1 语言功能预览
➜ 字符串模板(预览版)
使用字符串模板增强 Java 编程语言。字符串模板通过将文字文本与嵌入式表达式和模板处理器耦合来补充 Java 现有的字符串文字和文本块,以产生专门的结果。这是一个预览语言功能和 API。
➜ 未命名模式和变量(预览版)
使用未命名的模式(与记录组件匹配而不说明组件的名称或类型)和未命名变量(可以初始化但不使用)来增强 Java 语言。两者都由下划线字符 表示。这是一项预览语言功能。_
➜ 未命名类和实例主方法(预览版)
改进 Java 语言,以便学生可以编写他们的第一个程序,而无需了解为大型程序设计的语言功能。学生远非使用单独的Java方言,而是可以为单类程序编写简化的声明,然后随着技能的增长无缝扩展他们的程序以使用更高级的功能。这是一项预览语言功能。
2. 库改进
➜ 虚拟线程
将虚拟线程引入 Java 平台。虚拟线程是轻量级线程,可显著减少编写、维护和观察高吞吐量并发应用程序的工作量。
➜ 排序集合
引入新接口来表示具有定义的遭遇顺序的集合。每个这样的集合都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。它还提供统一的 API,用于访问其第一个和最后一个元素,以及以相反的顺序处理其元素。
“生活只能倒着理解;但它必须向前生活。
— 克尔凯郭尔
➜ 密钥封装机制接口
介绍密钥封装机制 (KEM) 的 API,这是一种使用公钥加密保护对称密钥的加密技术。
2.1 库改进预览和孵化器
➜ 外部函数和内存 API(第三预览版)
引入一个 API,通过该 API,Java 程序可以与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即JVM外部的代码)和安全地访问外部内存(即不由JVM管理的内存),API使Java程序能够调用本机库并处理本机数据,而不会像JNI那样脆弱和危险。这是一个预览版 API。
➜ 结构化并发(预览版)
通过引入结构化并发 API 来简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和取消,提高可靠性并增强可观测性。这是一个预览版 API。
➜ 作用域值(预览版)
引入作用域值,这些值可以在不使用方法参数的情况下安全有效地共享到方法。它们优先于线程局部变量,尤其是在使用大量虚拟线程时。这是一个预览版 API。
实际上,作用域值是一个隐式方法参数。“好像”调用序列中的每个方法都有一个额外的、不可见的参数。没有一种方法声明此参数,只有有权访问作用域值对象的方法才能访问其值(数据)。作用域值使通过一系列中间方法将数据从调用方安全地传递到远方被调用方成为可能,这些中间方法不声明数据的参数,并且无法访问数据。
➜ 载体 API(第六孵化器)
引入一个 API 来表达矢量计算,该计算在运行时可靠地编译为支持的 CPU 架构上的最佳矢量指令,从而实现优于等效标量计算的性能。
3. 性能改进
➜ 代代中关村
通过扩展 Z 垃圾回收器 (ZGC) 来提高应用程序性能,以便为年轻对象和旧对象维护不同的代。这将使ZGC能够更频繁地收集年轻物体 - 这些物体往往会英年早逝。
4. 管理权
➜ 准备禁止代理的动态加载
在将代理动态加载到正在运行的 JVM 中时发出警告。这些警告旨在让用户为将来的版本做好准备,该版本默认不允许动态加载代理,以便在默认情况下提高完整性。在启动时加载代理的功能功能工具不会导致在任何版本中发出警告。
详细新功能请参考:https://www.oracle.com/java/technologies/javase/21-relnote-issues.html
更新日志:
Java™ SE 开发工具包 21.0.3 (JDK 21.0.3)
发布日期:2024 年 4 月 16 日
此更新版本的完整版本字符串为 21.0.3+7(其中“+”表示“生成”)。版本号为 21.0.3。
IANA TZ 数据 2024a
JDK 21.0.3 包含 IANA 时区数据 2024a,其中包含以下更改:
Ittoqqortoormiit, 格陵兰岛 于 2024-03-31 更改时区。
沃斯托克, 南极洲 于 2023-12-18 更改了时区。
自 2020 年以来,南极洲凯西五次更改时区。
从 2072 年开始的巴勒斯坦时间戳的代码和数据修复。
从现在开始的时间戳的新数据文件 zonenow.tab。
哈萨克斯坦从 2024-03-01 开始在 UTC+5 上统一。
斋月过后一周,巴勒斯坦迅速崛起。
zic 不再假装支持无限期过去的 DST。
localtime 在 2422 年不再对华雷斯城进行错误处理。
有关详细信息,请参阅 JRE 软件中的时区数据版本。
安全基线
下表指定了 JDK 21.0.3 发布时 Java 运行时的安全基线:
Java 系列版本 安全基线(完整版本字符串)Security Baseline (Full Version String)
21 21.0.3+7
17 17.0.11+7
11 11.0.23+7
8 8U411-B09型
新功能
安全库/javax.crypto
➜ 将 XML Security for Java 更新到 3.0.3 (JDK-8319124)
XML 签名实现已更新到 Santuario 3.0.3。添加了对四种新的基于 SHA-3 的 RSA-MGF1 签名方法的支持:、 、 和 。虽然这些新算法 URI 未在 JDK 更新版本中定义,但它们可以表示为字符串文本,以便在功能上等效。SHA-3 哈希算法支持通过 JEP 287 交付给 JDK 9。在此之前发布的版本可能会使用第三方安全提供程序。SHA3_224_RSA_MGF1SHA3_256_RSA_MGF1SHA3_384_RSA_MGF1SHA3_512_RSA_MGF1javax.xml.crypto.dsig.SignatureMethod
其他说明
客户端库/java.awt
➜ 大多数 Linux 桌面不支持 AWT SystemTray API (JDK-8322750)
该 API 用于桌面任务栏中的通知,并且可能包含表示应用程序的图标。在 Linux 上,由于平台错误,Gnome 桌面在任务栏中自己的图标支持已经好几年没有正常工作了。这反过来又影响了依赖于它的 JDK 的 API。java.awt.SystemTray
因此,根据现有的 Java SE 规范,只要 JDK 确定可能存在平台错误,就会返回 false。java.awt.SystemTray.isSupported()
这种影响可能是有限的,因为应用程序始终必须检查该支持。此外,某些发行版已经好几年不支持 SystemTray,除非最终用户选择安装非捆绑桌面扩展。
security-libs/java.security
➜ 添加了 R1 和 E1 根证书 (JDK-8321408)
以下根证书已添加到 cacerts 信任库中:
+ Certainly
+ certainlyrootr1
DN: CN=Certainly Root R1, O=Certainly, C=US
+ Certainly
+ certainlyroote1
DN: CN=Certainly Root E1, O=Certainly, C=US
工具/javac
➜ 通过在记录模式中拒绝 final 使 javac 与 Java 语言规范保持一致 (JDK-8317300)
JDK 21 在 Java 语言中引入了模式匹配。但是,允许在记录模式前面,例如 (),这是 Java 语言规范不允许的。javacfinalcase final R(...) ->
在 JDK21 中可能错误编译的程序现在将无法编译。此更改修复了编译器中的问题。受影响的用户需要移除关键字。finalfinal
Bug 修复
此版本还包含针对 Oracle 关键补丁更新中描述的安全漏洞的修复。
➜ 21.0.3 中修复的问题:
# JBS公司 组件/子组件 总结
1 JDK-8319103型 客户端库/javax.swing 请求焦点的弹出窗口不会在带有 Wayland 的 Linux 上显示
2 JDK-8318590型 客户端库/javax.swing JButton 在绘制 HTML 文本时忽略边距
3 JDK-8299058型 核心库/java.net 连接空闲时 sun.net.httpserver.ServerImpl 中的 AssertionError
4 JDK-8323659型 core-libs/java.util.concurrent LinkedTransferQueue 添加和放置方法调用可重写的选件
5 JDK-8321480型 核心库/java.util:i18n ISO 4217 修正案 176 更新
6 JDK-8314612型 热点/编译器 TestUnorderedReduction.java失败,并显示 -XX:MaxVectorSize=32 和 -XX:+AlignVector
7 JDK-8321542型 热点/编译器 C2:缺少 ChaCha20 存根x86_32导致崩溃
8 JDK-8313720型 热点/编译器 C2 SuperWord:-XX:+UseVectorCmov -XX:+UseCMoveUnconditionally 的错误结果
9 JDK-8321974型 热点/编译器 ciKlass::is_subtype_of 中崩溃,因为 TypeAryPtr::_klass 未初始化
10 JDK-8316661型 热点/编译器 CompilerThread 在非产品中动态停止编译器线程时泄漏 CodeBlob 内存
11 JDK-8321215型 热点/编译器 VSIB 寻址模式的 x86 指令编码不正确
12 JDK-8316594型 热点/编译器 C2 SuperWord:手动展开环的错误结果
13 JDK-8319879型 热点/编译器 用于随机化增量内联决策的压力模式
14 JDK-8309203型 热点/编译器 C2:删除 InterfaceSet 的 GrowableArray 的按值复制
15 JDK-8310844型 热点/编译器 [AArch64]C1 编译失败,因为 OSR 缓冲区中的监视器偏移量太大,无法立即进行
16 JDK-8319372型 热点/编译器 C2 编译失败,并显示“错误的直接支配者信息”
17 JDK-8321599型 热点/编译器 AVX3 Base64 解码中的数据丢失
18 JDK-8322321型 热点/运行时 添加 -XX:+VerifySharedSpaces 的手册页文档
19 JDK-8323243 热点/运行时 JNI 调用抽象实例方法会损坏堆栈
20 JDK-8320208型 security-libs/java.security 将公共后缀列表更新为 b5bf572
21 JDK-8318971型 工具/jar 在处理不存在的文件时更好地处理 jar 工具的错误
22 JDK-8305971型 工具/javac JavacProcessingEnvironment 中缺少枚举构造函数主体的 NPE
23 JDK-8322040型 工具/javac ClassReader.parameter 中缺少数组边界检查
24 JDK-8320145型 工具/javac 编译器应接受 Record Pattern 中的最终变量
25 JDK-8321582型 工具/javac 生成 <primitive-type>.class 未正确解析。
26 JDK-8321164型 工具/javac 带有注释处理器的 javac 抛出 AssertionError: Filling jrt:/...在 JarFileObject[/...] 期间
27 JDK-8322159型 工具/javac ThisEscapeAnalyzer 因错误代码而崩溃