对 Java 应用程序进行故障诊断
如果 Java™ 应用程序存在问题,那么可以使用 CICS ® 和 JVM 提供的诊断来确定问题的原因。
关于此任务
您可以使用免费的工具来执行 JVM 的实时和脱机分析,例如 IBM® Health Center。 有关完整详细信息,请参阅 IBM Monitoring and Diagnostic Tools for Java - Health Center。
有关对 Liberty JVM 服务器中运行的 Web 应用程序进行故障诊断,请参阅 对 Liberty JVM 服务器和 Java Web 应用程序进行故障诊断。 有关在何处查找日志文件的信息,请参阅 控制 JVM 输出,日志,转储和跟踪的位置。
过程
- 如果无法启动 JVM 服务器,请检查 Java 安装的设置是否正确。 使用 JVM 的 stderr 文件中的 CICS 消息和任何错误来确定可能导致问题的原因。
- 请检查是否已安装正确版本的 Java SDK ,以及 CICS 是否有权在 z/OS UNIX 中对其进行访问。有关受支持 SDK 的列表,请参阅 高级语言和编译器支持。
- 检查是否在 CICS 区域中设置了 USSHOME 系统初始化参数。此参数指定 z/OS UNIX 上文件的主目录。
- 检查是否在 CICS 区域中正确设置了 JVMPROFILEDIR 系统初始化参数。此参数指定 JVM 概要文件在 z/OS UNIX 上的位置。
- 检查 CICS 区域是否具有对包含 JVM 概要文件的 z/OS UNIX 目录的读和运行访问权。
- 检查 CICS 区域是否对 JVM 的工作目录具有写访问权。在 JVM 概要文件的 WORK_DIR 选项中指定此目录。
- 检查 JVM 概要文件中的 JAVA_HOME 选项是否指向包含 Java SDK 的目录。
- 检查 SDFJAUTH 是否位于 CICS 启动 JCL 的 STEPLIB 并置中。
- 如果您正在使用 WebSphere® MQ 或 DB2® DLL 文件,请检查这些文件的 64 位版本是否可用于 CICS。
- 如果修改 DFHAXRO 以配置 Language Environment ® 封套,请确保运行时选项不超过 200 字节,并且这些选项有效。在将指定的选项传递到 Language Environment 之前, CICS 不会验证这些选项。 检查 SYSOUT 以获取来自 Language Environment 的任何错误消息。
- 请检查是否已安装正确版本的 Java SDK ,以及 CICS 是否有权在 z/OS UNIX 中对其进行访问。
- 如果设置正确,请收集诊断信息以确定应用程序和 JVM 发生的情况。
- 要获取诊断,必须使用 PRINT_JVM_OPTIONS=TRUE。 此选项的缺省值为 PRINT_JVM_OPTIONS=FALSE,因此如果保留为缺省值,那么诊断不存在任何选项。 在指定 PRINT_JVM_OPTIONS=TRUE 时,会将启动时传递到 JVM 的所有选项(包括类路径的内容)打印到 SYSPRINT。 每次使用其概要文件中的此选项启动 JVM 时,都将生成该信息。
- 检查 dfhjvmout 和 dfhjvmerr 文件以获取来自 JVM 的信息和错误消息。这些文件位于 JVM 概要文件中的 WORK_DIR/applid/jvmserver 选项所指定的目录中。 如果在 JVM 概要文件中更改了 STDOUT 和 STDERR 选项,那么文件可能具有不同的名称。
- 如果应用程序失败或性能低下,请调试应用程序。
- 如果接收到
java.lang.ClassNotFoundException错误,并且事务异常终止并返回 AJ05 代码,那么应用程序可能无法访问 OSGi 框架中的 IBM 或供应商类。 有关如何解决此问题的更多信息,请参阅 升级 Java 环境。 - 使用 CEDX 事务以调试应用程序事务。 对于 Liberty JVM 服务器,如果正在使用 URI 映射以将入站应用程序请求匹配到应用程序事务,请调试此事务。 如果使用缺省事务 CJSA,那么必须在 DFHEDFTC 事务类上(如果如果使用 CEDY,那么在 DFHEDFTO 事务类上)将 MAXACTIVE 属性设置为 1。 此设置是必需的,因为大量 CJSA 任务可能正在运行,并且您可能会调试错误事务。 请勿在生产环境中的 CJSA 事务上使用 CEDX。
- 要将调试器用于 JVM 服务器,必须在 JVM 概要文件中设置一些选项。 有关更多信息,请参阅 调试 Java 应用程序。
- 如果想要确定 OSGi 捆绑软件和服务的状态,请使用 OSGi 控制台。 在 JVM 概要文件中设置以下属性:
-Dosgi.file.encoding=ISO-8859-1和-Dosgi.console=host:port,其中,host是 JVM 服务器正在其上运行的系统的主机名,而port是相同系统上的可用端口。 在指定osgi.console.encoding属性以允许 OSGi 控制台使用首选编码而不将整个 JVM 放入此编码时,Equinox OSGi 框架中未解决的错误将阻止其使用,您必须改为将file.encoding值设置为基于 ASCII 的编码。 如果正在使用 OSGi JVM 服务器,那么将 OSGI_CONSOLE=TRUE 添加到 JVM 概要文件。 如果您正在使用 Liberty JVM 服务器,请将 osgiConsole-1.0 功能部件添加到 server.xml。 通过使用 Telnet 会话以及在 JVM 概要文件中指定的主机和端口属性,连接到 OSGi 控制台。注: 如果在 OSGi 控制台中输入 exit 命令,那么将对运行 JVMSERVER 的环境发出 system.exit(0) 调用。 用于断开终端与 OSGi 控制台连接的命令是 disconnect。 system.exit(0) 是所有线程和工作负载的突然停止,如果要继续处理,可能会使 JVM 和 CICS 处于不确定状态。 CICS 旨在在此事件中执行立即关闭,以避免后续的复杂情况。 为此,重要的是控制对 JVM 概要文件和 server.xml 的写访问权。 Liberty JVM 服务器通过要求在 OSGi 控制台可运行之前包含 osgiConsole-1.0 功能部件来提供进一步保护。 OSGi 控制台主要是开发和调试助手,预计不会在生产环境中运行。
- 如果接收到
- 如果发生内存不足错误,那么可能指示 JVM 或 CICS 地址空间未分配足够的存储空间,应用程序可能发生内存泄漏,或者堆大小可能不足。
- 使用 CICS 统计信息或诸如 IBM Health Center 之类的工具来监视 JVM。 如果应用程序发生内存泄漏,那么在垃圾回收之后保留的活动数据量会随时间逐渐增长,直至堆耗尽。JVM 服务器统计信息报告上次垃圾回收后的堆大小以及堆的最大和峰值大小。 有关更多信息,请参阅 使用 IBM Health Center 分析 Java 应用程序。
- 针对 Language Environment 运行存储报告以查明存储容量是否足够。有关更多信息,请参阅 Language Environment Enclave storage for JVM。
- 使用 CICS 统计信息或诸如 IBM Health Center 之类的工具来监视 JVM。 如果应用程序发生内存泄漏,那么在垃圾回收之后保留的活动数据量会随时间逐渐增长,直至堆耗尽。
- 如果在安装或运行 Java 应用程序时迂到编码错误,那么可能设置了冲突或不受支持的代码页组合。z/OS 上的 JVM 通常使用 EBCDIC 代码页进行文件编码; 非 Liberty JVM 服务器的缺省值为 IBM1047 (或 cp1047) ,但如果需要, JVM 可以使用其他代码页进行文件编码。 CICS 需要 EBCDIC 代码页来处理字符数据,并且所有 JCICS 调用都必须使用 EBCDIC 代码页。 在 CICS 区域的 LOCALCCSID 系统初始化参数中设置代码页。
- 检查 JVM 服务器日志以查看是否发出了与 LOCALCCSID值相关的任何警告消息。如果将此参数设置为非 EBCDIC 代码页、JVM 不支持的代码页或不支持的 EBCDIC 代码页(例如,930),那么 JVM 服务器使用 cp1047。
- JCICS 调用使用 LOCALCCSID 系统初始化参数中指定的代码页。如果应用程序期望不同的代码页,那么会遇到编码错误。 要将不同的代码页用于 JCICS,请在 JVM 概要文件中设置 -Dcom.cics.jvmserver.override.ccsid= 参数。
- 如果要在 JVM 概要文件中使用 -Dcom.cics.jvmserver.override.ccsid= 参数,请确保 CCSID 是 EBCDIC 代码页。 在使用 JCICS 调用时,应用程序必须使用 EBCDIC。
- 如果要在 Axis2 JVM 服务器中运行 SOAP 处理,请确保 -Dfile.encoding JVM 属性指定 EBCDIC 属性。 如果指定非 EBCDIC 代码页,例如,UTF-8,那么 Web Service 请求失败并且响应包含损坏的数据。
- 检查 JVM 服务器日志以查看是否发出了与 LOCALCCSID值相关的任何警告消息。
- 如果遇到启动超时或工作负载超时,那么可调整各种参数来帮助解决问题。 以下提供可调整的值的指示:
- 修改 -Dcom.ibm.cics.jvmserver.threadjoin.timeout 设置以控制 HTTP 请求等待获取 JVM 服务器线程的时间长度。
- 提高 JVMSERVER 资源上的 THREADLIMIT 值。
- 如果 THREADLIMIT 已设置为允许的最大值,那么您尝试运行的工作可能要多于单个 JVM 服务器可处理的工作。 考虑均衡多个 JVM 服务器或多个区域之间的工作负载。
或者,由于其他约束,您的 CICS 系统可能无响应。 遵循标准过程来诊断性能问题。 请参阅 提高 CICS 系统的性能。