已知问题与限制
您在特定的系统环境或配置中可能遇到的已知问题或限制。
此处描述的某些问题可能并非该版本的缺陷,因为在可行的情况下,我们已提供了相应的解决方法。
此发行版中新出现的问题或限制
__MAP_64不支持该标志- 在 z/OS 上运行的 Java 25 未启用用于内存映射操作的
__MAP_64标志。 因此,它无法将大文件(≥ 2 GB)可靠地映射到连续的地址范围中。 有关此行为的更多详细信息,请参阅 mmap() — 映射内存页。 由于这一限制,需要映射超过Integer.MAX_VALUE字节且会实例化 Java 对象的操作预计会失败。例如,
MemorySegment.getString(long)受 Java 中 int 类型大小限制的约束。 如果在映射大小为 的内存段上 getString(100) 调用 ,该操作size(long) Integer.MAX_VALUE + 100可能会因IllegalArgumentException或 而失败IndexOutOfBoundsException。 这是预期的行为。影响 :此问题影响使用 Foreign Function & Memory API、 FileChannel.map()或其他内存映射文件操作且超过 限制
Integer.MAX_VALUE的应用程序。 由于这些限制,内存映射操作实际上被限制在约 1.5 GB 至 2GB 之间,具体取决于系统配置(特别是 BPXPRMxx 中的参数MAXASHARE)。解决方法: 将大文件拆分为多个较小的文件(每个小于 2 GB),并分别进行映射,而不是将整个文件作为单个 Java 对象加载到内存中。 或者,可以使用传统的文件 I/O 操作,而不是内存映射。
系统要求: 请确保将 z/OS 系统参数
MAXASHARE和MAXMMAPAREA配置为支持至少2 GB的可寻址范围。 如有必要,请联系系统管理员以核实并调整这些设置。 - 在 COMPAT 模式下,不支持解析采用 IBM‑1047 (EBCDIC)编码的证书
- 在 z/OS 上的 Java 25 中, X.509 的证书解析需要 UTF‑8 编码的输入。 在 COMPAT 模式或 FIPS 模式下使用 IBM‑1047 (EBCDIC)编码时,证书解析会失败。 在内部,该
X509Factory.parseX509orPKCS7Cert()方法(由 调用CertificateFactory)作为 JEP 400 之后编码检测逻辑的一部分,强制执行 UTF‑8。 因此,使用 IBM‑1047 编码的证书数据无法被解析,导致CertificateException: No certificate data found……支持的配置:- Java 25 默认模式( UTF‑8 )
不支持的配置:- Java 25 兼容模式( IBM‑1047 )
此行为符合设计预期,并与以下 JEP 引入的平台编码变更保持一致。- JEP 400 :默认启用 UTF‑8
- JEP 470(预览) :增强的编码检测与处理行为
- z/OS 文件时间戳限制
- 在 z/OS 中,操作系统提供的文件时间戳值仅具有秒级精度。 因此,无论提供的毫秒值为何,以下 API 都会返回或更新精度为秒级的时间戳:
- File.setLastModified()
- File.lastModified()
- ZipEntry.setTime()
- ZipEntry.getTime()
注: 此限制是 z/OS 平台的固有特性,在之前的版本中也存在。 在 z/OS 上,需要毫秒级精度时间戳的应用程序应实现替代的计时机制。 - JAXP 实体大小限制已降低
- 从 Java 24 开始,JAXP 的安全限制已有所降低(例如,从 50,
jdk.xml.totalEntitySizeLimit000,000 降至 100,000),这可能会导致处理大型 XML 文档的应用程序出现 XML 处理错误。 有关这些更改及缓解方案的更多信息,请参阅《 从早期版本迁移》。
以前的发行版中存在的问题和限制仍适用
- “健康中心”工具中的“原生内存视图”功能无法正常工作
表格中的该
Total Physical MemoryNative memory table字段为空。 该字段的数据来源于从 API 获取的信息 getTotalPhysicalMemorySize,而该 API 已弃用。 由于无法读取物理内存数据,系统会每隔 5 秒(内存读取stdout间隔)向标准输出流写入一条com.ibm.lang.management.OperatingSystemMXBean.getTotalPhysicalMemory()异常消息。 该问题正在处理中,并将在 Java 21 的未来版本中修复。 在此之前,作为临时解决方案,请将 JVM 选项 -Dcom.ibm.diagnostics.healthcenter.data.memory 设置为off,这将禁用健康中心中与内存相关的数据收集功能。- Java 21 keytool 相关问题
- 使用该工具时,建议配合 -file 选项 zseckeytool -exportcert及文件名一起使用。 这有助于确保导出的证书未添加标签,且采用 DER 编码。 为了保持 DER 编码,必须确保文件不带标签,并避免无意中将其转换为其他格式。
如果您更倾向于使用 PEM 编码,可以将该 -rfc 选项与另一个 -file 选项结合使用。 导出的 PEM 证书采用 ISO8859-1 编码。 要读取该文件,请使用命令 chtag -tc ISO8859-1 对证书进行标记,并设置相应的 z/OS 自动转换环境变量。
对于采用 DER 编码的证书文件,建议使用Java 17版或更早版本的keytool进行打印。 Java 21 存在一个 keytool 已知问题,即某些信息可能无法正确打印。
在打印 PEM 编码的证书文件时,您也可以使用该 OpenSSL 工具来协助操作。
总而言之,在使用该 zseckeytool -exportcert 工具时,请注意编码和标记选项,以确保证书的打印准确且一致。
- 使用外部函数和内存 API 的应用程序的限制
当从外部函数调用的 Java 代码遇到异常时,应用程序可能会意外退出。
- 不支持 java.awt.Robot 该类
- 该类在 java.awt.Robotz/OS 系统上不被支持。 在 z/OS 系统上,使用Robot类的Java程序可能无法正常运行。
- jlink 该工具试图为 设置 APF 授权属性, libj9ifa29.so 以满足 zIIP 的资格要求
- 当您使用该 jlink 工具创建本机运行时映像时,该工具会尝试为该库设置 APF 授权属性,以确保 Java 应用程序仍符合由 libj9ifa29.soIBM System z 集成信息处理器 ( zIIP ) 进行处理的条件。 如果您无权执行 APF 操作,系统将显示一条警告信息:
Warning: APF authorization failed for lib/default/libj9ifa29.so
- 类路径长度限制
如果类路径字符数超过 2031 个,shell 会将类路径截取为 2031 个字符。 如果需要长度超过 2031 个字符的类路径,请使用选项文件。 有关详细信息,请参阅 《java 命令》 中的 @argfile。
- 使用 `stout` 或 `stderr` 写入的消息在使用 `redirect freopen() ` 时可能不会被重定向
- 如果 Java™ 应用程序使用 C/C++ 函数 freopen() 将 或 stderr 流从一种类型的 stdout 文件重定向到另一种类型的文件,则 JVM 写入 stdout 或 的消息 stderr 可能不会被重定向到新文件。 要解决此问题,请在启动
trueJVM 时将 com.ibm.writeToStandardOutputsUsingStreams 系统属性设置为。 此属性指定输出将通过文件流进行写入,该文件流支持在 MVS 数据集与Unified Storage Server (USS) Z文件系统( zFS )文件之间进行数据重定向。注意: 此设置还会将默认缓冲行为从no buffering更改为line buffering,因此输出可能不会立即显示。 为解决此问题,请在调用 函数 freopen() 后,使用 或 setvbuf() setbuf() 函数禁用缓冲。
其他问题
如果您遇到无法解决的问题,请参阅《 Java SDK 故障排除指南 》,其中提供了相关建议以及关于如何提交问题的信息。