第 3 章 Red Hat build of OpenJDK 功能
最新的红帽构建的 OpenJDK 21 发行版本可能包括新功能。另外,最新版本可能会增强、弃用或删除来自以前红帽构建的 OpenJDK 21 版本的功能。
有关所有其他更改和安全修复,请参阅 OpenJDK 21.0.3 发行版本。
Red Hat build of OpenJDK 的改进
红帽构建的 OpenJDK 21 提供对最初在红帽构建的 OpenJDK 版本中创建的功能的改进。
Java 编译器通过拒绝记录模式中的 最终 关键字来与 Java 语言规格一致
Java 21 版本增强了 Java 语言,其特征与交换机语句的模式匹配。但是,红帽构建的 OpenJDK 21 提供了一个 javac 编译器,允许在记录模式前使用 最终 关键字(例如,最终 R (…)->)。这对 final 关键字的使用违反了 Java 语言规范。
在红帽构建的 OpenJDK 21.0.3 中,javac 编译器与 Java 语言规格一致。此增强意味着在 switch 语句中包含 最终 关键字的任何程序现在都无法编译。在这种情况下,为了确保程序成功编译,您必须删除 final 关键字。
请参阅 JDK-8317300 (JDK Bug System)。
Java 更新到 Apache Santuario 3.0.3 的 XML 安全性。
在红帽构建的 OpenJDK 21.0.3 中,XML 签名实现基于 Apache Santuario 3.0.3。
此增强包括以下四个基于 SHA3 的 RSA-MGF1 SignatureMethod 算法:
-
SHA3_224_RSA_MGF1 -
SHA3_256_RSA_MGF1 -
SHA3_384_RSA_MGF1 -
SHA3_512_RSA_MGF1
由于在更新版本中无法修改 javax.xml.crypto.dsig.SignatureMethod API,以便为新算法提供恒定值,因此请为这些算法使用以下等效的字符串字面值:
-
http://www.w3.org/2007/05/xmldsig-more#sha3-224-rsa-MGF1 -
http://www.w3.org/2007/05/xmldsig-more#sha3-256-rsa-MGF1 -
http://www.w3.org/2007/05/xmldsig-more#sha3-384-rsa-MGF1 -
http://www.w3.org/2007/05/xmldsig-more#sha3-512-rsa-MGF1
请参阅 JDK-8319124 (JDK Bug System)。
TrimNativeHeapInterval 选项可作为产品交换机使用
红帽构建的 OpenJDK 21.0.3 提供 -XX:TrimNativeHeapInterval=ms 作为官方产品交换机。此功能增强使 JVM 可以在受支持的平台上以指定间隔(以毫秒为单位)修剪原生堆。目前,只有这个增强支持的平台是带有 glibc 的 Linux。
您可以通过设置 TrimNativeHeapInterval=0 来禁用修剪。修剪功能默认为禁用。
请参阅 JDK-8325496 (JDK Bug System)。
在大多数 Linux 桌面上,SystemTray.isSupported () 方法返回 false
在红帽构建的 OpenJDK 21.0.3 中,java.awt.SystemTray.isSupported () 方法在不支持 SystemTray API 的系统上返回 false。此功能增强取决于 SystemTray API 规格。
SystemTray API 用于与系统桌面中的任务栏交互,以提供通知。SystemTray 可能还包括代表应用程序的图标。由于底层平台问题,对任务栏图标的 GNOME 桌面支持在数年内无法正常工作。此平台问题会影响 JDK 在 GNOME 桌面上提供 SystemTray 支持的能力。此问题通常会影响使用 GNOME Shell 44 或更早版本的系统。
因为缺少正确的 SystemTray 支持是某些系统上的长期问题,所以这个 API 增强在受影响系统中返回 false 可能会对用户造成最小的影响。
请参阅 JDK-8322750 (JDK Bug System)。
意外的 R1 和 E1 根证书
在红帽构建的 OpenJDK 21.0.3 中,cacerts truststore 包括两个 Certainly root 证书:
- 证书 1
- 名称 :Certainly
- 别名名称:clearrootr1
- 区分名称:CN=Certainly Root R1, O=Certainly, C=US
- 证书 2
- 名称 :Certainly
- 别名名称:clearroote1
- 区分名称:CN=Certainly Root E1, O=Certainly, C=US
请参阅 JDK-8321408 (JDK Bug System)。
为sng 集合根对大型对象阵列进行精确扫描
在生成对象的集合过程中,Parallel Garbage Collector (GC)将旧生成对象分区到 64 kB 条带,以扫描对年轻代的引用。这些条带被分配给 worker 线程,以便并行执行扫描。
以前的红帽构建的 OpenJDK 21 版本不会将 worker 线程限制为自己的条带。这缺少对 parallelism 的限制。例如,如果在分配给特定 worker 线程的条带中启动大型对象,则此线程最终可能会扫描多个条带上有数千个引用的对象。
红帽构建的 OpenJDK 21.0.3 将每个 worker 线程限制为其分配的条带。现在,每个线程只处理大型对象阵列的有趣的部分。当大型对象阵列存在时,对 Parallel GC 暂停现在类似于 Garbage-First (G1)收集器的暂停。在某些情况下,这个增强有助于将暂停的长度减少 75-80%。例如,之前版本的一个 100millisecond 暂停可能会降低到这个版本中的 20millisecond pause。
请参阅 JDK-8310031 (JDK Bug System)。
修复了使用 ZGC 和非默认 ObjectAlignmentInBytes 值时潜在的 JVM 失败
在早期版本的 OpenJDK 21 中,如果您使用 -XX:+UseZGC 选项运行 JVM,并为 -XX:ObjectAlignmentInBytes 运行 JVM,则 JVM 可能会失败或出现故障。出现这个问题的原因是,ZBarrierSet::clone_obj_array 会忽略对象数组末尾的 padding。
红帽构建的 OpenJDK 21.0.3 解决了这个问题,在使用 Z Garbage Collector (ZGC)和非默认值时,您可以成功运行 JVM。