编程工具

关注公众号 jb51net

关闭
Java SE Development Kit(JDK) 21.0.8 LTS 官方正式版 Win64

Java SE Development Kit(JDK) 21.0.8 LTS 官方正式版 Win64

您还可以选择:官方全版本下载

热门排行

简介

Java 21 / JDK 21 已正式 GA,此版本是继 JDK 17 后的长期支持版本 (LTS),Oracle 将为其提供至少八年的技术支持和更新。根据 Oracle 免费条款和条件 (NFTC),JDK 21 二进制文件可在生产中免费使用,也可免费再分发。

JDK 21 将根据 NFTC 接受更新,直至 2026 年 9 月,即下一个 LTS 发布一年后。JDK 21 的后续更新将根据 Java SE OTN License (OTN) 授权,超出 OTN License 有限免费授权范围的生产使用将需要付费。

Java SE Development Kit 21提供了数以千计的性能、稳定性和安全性改进,包括平台增强功能,可帮助开发人员提高工作效率并推动整个组织的创新和增长。新版本在语言特点、库、性能、管理权等多个方面进行主要更新和增强,全新的功能带来绝佳的使用体验!

主要新功能

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

正式稳定功能

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(孵化器第六阶段)

Java SE Development Kit 21安装教程

1、下载并解压,如图所示

2、安装,安装目录

3、安装完成,根据提示进行后续设置

更新日志

Java™ SE 开发工具包 21.0.8 (JDK 21.0.8)
7月 15, 2025

此更新版本的完整版本字符串为 21.0.8+12 (其中 “+” 表示 “生成”) 。版本号为 21.0.8。此 JDK 符合 Java SE 规范 (JSR 396 2023-09-19) 的版本 21。

IANA TZ 数据 2025b

JDK 21.0.8 包含 IANA 时区数据 2025b,其中包含以下更改:

智利艾森地区的新区域,从 -04/-03 移至 -03。
有关详细信息,请参阅 JRE 软件中的时区数据版本。

安全基线

下表指定了 JDK 21.0.8 发布时 Java 运行时环境 (JRE) 的安全基线:

Java 系列版本    安全基线(完整版本字符串)
21    21.0.8+12
17    17.0.16+12
11    11.0.28+12
8    1.8.0_461-b11

使 JDK 保持最新状态

Oracle 建议在每次关键补丁更新时更新 JDK。 为了确定某个版本是否是最新版本,“安全基线”页面可以 用于确定每个版本系列的最新版本。

包含安全漏洞修复的关键补丁更新会提前一年公布 关键补丁更新、安全警报和公告。 不建议在计划的下一个关键补丁更新之后使用此 JDK(版本 21.0.8) 2025 年 10 月 21 日。

Java 管理服务可供所有用户使用,可以帮助您在系统中查找易受攻击的 Java 版本。在 Oracle Cloud 中运行的 Java SE 订阅者和客户可以使用 Java 管理服务来更新 Java 运行时并执行进一步的安全审查,例如识别 Java 程序使用的潜在易受攻击的第三方库。现有 Java 管理服务用户单击此处登录您的仪表板。Java Management Service 文档提供了对所有人可用的功能列表,以及仅对客户可用的功能。了解有关使用 Java Management Service 监视和保护 Java 安装的更多信息。

删除的功能和选项

security-libs/java.security
➜ 在到期日期后删除了 Baltimore CyberTrust 根证书 (JDK-8303770)
以下过期的根证书已从密钥库中删除:cacerts

+ alias name "baltimorecybertrustca [jdk]"

  Distinguished Name: CN=Baltimore CyberTrust Root, OU=CyberTrust, O=Baltimore, C=IE

security-libs/java.security
➜ 删除了两个 Camerfirma 根证书 (JDK-8350498)
以下已终止且不再使用的根证书已从密钥库中删除:cacerts

+ alias name "camerfirmachamberscommerceca [jdk]"

  Distinguished Name: CN=Chambers of Commerce Root, OU=http://www.chambersign.org, O=AC Camerfirma SA CIF A82743287, C=EU

+ alias name "camerfirmachambersignca [jdk]"
  Distinguished Name: CN=Global Chambersign Root - 2008, O=AC Camerfirma S.A., SERIALNUMBER=A82743287, L=Madrid (see current address at www.camerfirma.com/address), C=EU

其他说明

security-libs/java.security
➜ 添加了 4 个来自 Sectigo Limited 的新根证书 (JDK-8359170)
以下根证书已添加到 cacerts 信任库中:

+ Sectigo Limited

  + sectigocodesignroote46
    DN: CN=Sectigo Public Code Signing Root E46, O=Sectigo Limited, C=GB

+ Sectigo Limited
  + sectigocodesignrootr46
    DN: CN=Sectigo Public Code Signing Root R46, O=Sectigo Limited, C=GB

+ Sectigo Limited
  + sectigotlsroote46
    DN: CN=Sectigo Public Server Authentication Root E46, O=Sectigo Limited, C=GB

+ Sectigo Limited
  + sectigotlsrootr46
    DN: CN=Sectigo Public Server Authentication Root R46, O=Sectigo Limited, C=GB

安装/安装
➜ 使用 OL9 签名密钥对 oracle.com JDK RPM 包进行签名 (JDK-8351906(非公开))
oracle.com 个旨在直接下载到目标系统的 JDK RPM 包现在使用 OL9 签名密钥而不是 OL8 签名密钥进行签名。托管在 YUM 存储库上的 RPM 包仍使用目标存储库的相应密钥进行签名。

核心库/java.net
➜ java.net.http.HttpClient 已得到增强,可向服务器报告 HTTP/2 流控制错误 (JDK-8342075)

现在,当检测到 HTTP/2 流控制错误时,将向服务器报告这些错误。这是一个实现细节,应该对 API 用户透明,但如果连接到不合规的 HTTP/2 服务器,可能会导致流被重置或连接被关闭。java.net.http.HttpClientHttpClient

security-libs/java.security
➜ 更新了 HSS/LMS 公钥编码 (JDK-8347596)

HSS/LMS 公钥的 X.509 编码格式已更新,以符合 RFC 9708 中概述的最新标准。值得注意的是,已删除环绕公钥值的附加 OCTET STRING。为了兼容性,仍可识别早期 JDK 版本生成的公钥编码。

security-libs/java.security
➜ 具有 OCSP 超时的兼容 OCSP readtimeout 属性 (JDK-8347506)

在 JDK 21 中,通过 JDK-8179502 发布了各种超时属性的增强语法。这包括一个新的系统属性,它允许用户在成功建立 TCP 连接后读取 OCSP 响应时控制超时。com.sun.security.ocsp.readtimeout

这会将此属性的默认状态更改为系统属性的值,使其原始默认值为 15 秒。如果系统属性也未设置,则其默认的 15 秒超时将传播到 的默认值 。com.sun.security.ocsp.timeoutcom.sun.security.ocsp.timeoutcom.sun.security.ocsp.readtimeout

security-libs/jdk.security
➜ 如果删除了条目,Jarsigner 应打印警告 (JDK-8309841)

如果从已签名的 JAR 文件中删除了某个条目,则没有机制可以检测该条目是否已使用 API 被删除,因为该方法返回的就好像该条目从未存在过一样。通过此更改,该命令会分析签名文件,如果某些部分没有匹配的文件条目,它会打印出以下警告:“此 JAR 包含不存在的文件的签名条目”。用户可以通过向命令添加选项来进一步查找这些条目的名称。JarFilegetJarEntrynulljarsigner -verify-verbose

错误修复

此版本还包含针对 Oracle 关键补丁更新中描述的安全漏洞的修复。

➜ 21.0.8 中修复的问题:

#    JBS公司    组件/子组件    总结
1    JDK-8348597    客户端库/2d    将 HarfBuzz 更新到 10.4.0
2    JDK-8348596    客户端库/2d    将 FreeType 更新到 2.13.3
3    JDK-8348600    客户端库/java.awt    将 PipeWire 更新到 1.3.81
4    JDK-8348598    客户端库/java.awt    将 Libpng 更新至 1.6.47
5    JDK-8280991    客户端库/java.awt    [XWayland]setDisplayMode 调用后没有 displayChanged 事件
6    JDK-8286204    客户端库/javax.accessibility    [辅助功能,macOS,旁白]当用户在 macOS 上首次迭代到 10 时,VoiceOver 会将微调器值 10 读取为 1
7    JDK-8345728    客户端库/javax.accessibility    [辅助功能,macOS,屏幕放大镜]:JCheckbox 未选中状态不放大,但适用于选中状态
8    JDK-8348936    客户端库/javax.accessibility    [辅助功能,macOS,旁白]VoiceOver 不会宣布在 macOS 上使用“空格”键切换复选框时取消选中
9    JDK-6928542    客户端库/javax.swing    RTF 中的汉字不被解码
10    JDK-8322754    客户端库/javax.swing    单击 JComboBox 当对话框即将关闭时会导致 IllegalComponentStateException
11    JDK-8318915    核心库/java.math    增强 BigDecimal.toPlainString() 中的检查
12    JDK-8335181    核心库/java.net    HttpClient 中 HTTP/2 GOAWAY 帧处理不正确
13    JDK-8343855    核心库/java.net    HTTP/2 ConnectionWindowUpdateSender 可能会错过关闭流中一些未处理的数据帧
14    JDK-8353787    核心库/java.util.jar    SHA-384-Digest java.util.jar.Attributes$Name 实例数量增加,导致内存占用增加
15    JDK-8344589    核心库/java.util:i18n    将 IANA 语言子标记注册表更新至版本 2024-11-19
16    JDK-8356096    核心库/java.util:i18n    ISO 4217 修正案 179 更新
17    JDK-8345296    热点/编译器    AArch64:不允许 prctl 时,虚拟机与 SIGILL 崩溃
18    JDK-8349637    热点/编译器    在某些情况下,Integer.numberOfLeadingZeros 输出不正确
19    JDK-8308966    热点/编译器    为 x86、AVX2 和 AVX512 添加浮点/双模的固有
20    JDK-8314056    热点/编译器    从 frem/drem 中删除运行时平台检查
21    JDK-8336042    热点/编译器    取消优化中的调用方/被调用方参数大小不匹配导致崩溃
22    JDK-8357105    热点/编译器    C2:编译失败,并显示“assert(false) failed: opty program during loop optimization detected empty program”
23    JDK-8332717    热点/GC    ZGC:启发式除以零
24    JDK-8343285    热点/运行时    java.lang.Process 无响应,CPU 使用率飙升至 100%
25    JDK-8343599    热点/运行时    打印容器信息时交换的 Kmem 限制值和最大值
26    JDK-8320892    热点/运行时    AArch64:JNI后恢复FPU控制状态
27    JDK-8339148    热点/运行时    将 os::Linux::active_processor_count() 公开
28    JDK-8345569    热点/运行时    [UBSAN] macOS aarch64 的 filemap.cpp 和 virtualspace.cpp 调整
29    JDK-8319650    热点/SVC    使用类元数据缓存提高堆转储性能
30    JDK-8320924    热点/SVC    通过优化存档对象检查来提高堆转储性能
31    JDK-8311546    security-libs/java.security    证书名称约束未正确验证前导句点
32    JDK-8344361    security-libs/java.security    还原旧版提供程序中无效服务的空返回
33    JDK-8332921    工具/jshell    Ctrl+C 在 JLine 升级后不调用关机钩子

大家还下载了