对 Java 应用程序进行故障诊断

如果 Java™ 应用程序存在问题,那么可以使用 CICS 和 JVM 提供的诊断来确定问题的原因。 CICS 提供了一些统计信息,消息和跟踪,以帮助您诊断与 Java 相关的问题。 与 CICS 相比,随 Java 提供的诊断工具和接口可提供有关 JVM 中发生的情况的更详细信息,因为 CICS 不知道 JVM 中的许多活动。

关于此任务

您可以使用免费提供的工具对 JVM 进行实时和离线分析,例如 IBM Health Center。 详情请见 IBM Monitoring and Diagnostic Tools for Java - Health Center.

有关在 Liberty JVM 服务器中运行的 Web 应用程序的故障排除,请参阅故障排除 Liberty JVM 服务器和 Java Web 应用程序。 有关在何处查找日志文件的信息,请参阅控制 JVM 输出、日志、转储和跟踪的位置

过程

  1. 如果无法启动 JVM 服务器,请检查 Java 安装的设置是否正确。
    使用 CICS 消息以及 JVM 的 stderr 文件中的任何错误来确定可能导致问题的原因。
    1. 检查是否安装了正确版本的 Java SDK,以及 CICS 是否可以访问 z/OS UNIX。
      有关受支持 SDK 的列表,请参阅 对 CICS 支持应用程序编程语言的更改
    2. 检查是否在 CICS 区域中设置了 USSHOME 系统初始化参数。
      该参数指定 z/OS UNIX 上文件的归属地。
    3. 检查是否在 CICS 区域中正确设置了 JVMPROFILEDIR 系统初始化参数。
      该参数指定 JVM 配置文件在 z/OS UNIX 上的位置。
    4. 检查 CICS 区域是否具有对包含 JVM 配置文件的 z/OS UNIX 目录的读取和运行访问权限。
    5. 检查 CICS 区域是否对 JVM 的工作目录具有写访问权。
      在 JVM 概要文件的 WORK_DIR 选项中指定此目录。
    6. 检查 JVM 概要文件中的 JAVA_HOME 选项是否指向包含 Java SDK 的目录。
    7. 如果您正在使用 IBM® MQDb2® DLL 文件,请检查这些文件的 64 位版本是否可用于 CICS。
    8. 如果修改 DFHAXRO 以配置 Language Environment enclave,请确保运行时选项不超过 200 字节,且选项有效。
      CICS 在将您指定的选项传递给 之前不会对其进行验证。 Language Environment 检查 SYSOUT 是否有来自 Language Environment 的错误信息。
  2. 如果设置正确,请收集诊断信息以确定应用程序和 JVM 发生的情况。
    1. 要获取诊断,必须使用 PRINT_JVM_OPTIONS=TRUE。 此选项的缺省值为 PRINT_JVM_OPTIONS=FALSE,因此如果保留为缺省值,那么诊断不存在任何选项。 在指定 PRINT_JVM_OPTIONS=TRUE 时,会将启动时传递到 JVM 的所有选项(包括类路径的内容)打印到 SYSPRINT。 每次使用其概要文件中的此选项启动 JVM 时,都将生成该信息。
    2. 检查 dfhjvmoutdfhjvmerr 文件以获取来自 JVM 的信息和错误消息。
      这些文件位于 JVM 概要文件中的 WORK_DIR/applid/jvmserver 选项所指定的目录中。 如果在 JVM 概要文件中更改了 STDOUTSTDERR 选项,那么文件可能具有不同的名称。
  3. 如果应用程序失败或性能低下,请调试应用程序。
    • 如果接收到 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 控制台连接的命令是 disconnectsystem.exit(0) 是所有线程和工作负载的突然停止,如果继续处理,可能会使 JVM 和 CICS 处于不确定状态。 CICS 旨在在此事件中禁用并重新启动 JVM 服务器,以避免后续的复杂情况。 为此,重要的是控制对 JVM 概要文件和 server.xml 的写访问权。 Liberty JVM 服务器通过要求在 OSGi 控制台可运行之前包含 osgiConsole-1.0 功能部件来提供进一步保护。 OSGi 控制台主要是开发和调试助手,预计不会在生产环境中运行。
  4. 如果发生内存不足错误,那么可能指示 JVM 或 CICS 地址空间未分配足够的存储空间,应用程序可能存在内存泄漏,或者堆大小可能不足。
    1. 使用 CICS 统计信息或诸如 IBM Health Center 之类的工具来监视 JVM。 如果应用程序发生内存泄漏,那么在垃圾回收之后保留的活动数据量会随时间逐渐增长,直至堆耗尽。
      JVM 服务器统计信息报告上次垃圾回收后的堆大小以及堆的最大和峰值大小。 有关更多信息,请参阅 使用 IBM Health Center 分析 Java 应用程序
    2. 针对 Language Environment 运行存储报告以查明存储容量是否足够。
  5. 如果在安装或运行 Java 应用程序时迂到编码错误,那么可能设置了冲突或不受支持的代码页组合。
    • Java 21 在Java 21中, z/OS JVM通常使用 UTF-8 进行文件编码,但JVM可以根据需要使用其他代码页进行文件编码。
    • Java 8 Java 11 Java 17 使用 Java 8、Java 11 和 Java 17, z/OS 上的 JVM 通常使用 EBCDIC 代码页进行文件编码;非 Liberty JVM 服务器的默认代码页为 IBM1047 (或 cp1047 ),但如果需要,JVM 可以使用其他代码页进行文件编码。

    6.3CICS TS 6.3 起,已删除对 Java 8 和 Java 11 的支持。

    CICS 需要使用EBCDIC代码页来处理字符数据,所有JCICS调用都必须使用EBCDIC代码页。 代码页CICS的 LOCALCCSID 系统初始化参数中设置。

    1. 检查 JVM 服务器日志以查看是否发出了与 LOCALCCSID值相关的任何警告消息。
      如果将此参数设置为非 EBCDIC 代码页、JVM 不支持的代码页或不支持的 EBCDIC 代码页(例如,930),那么 JVM 服务器使用 cp1047。
    2. JCICS 调用使用 LOCALCCSID 系统初始化参数中指定的代码页。
      如果应用程序期望不同的代码页,那么会遇到编码错误。 要将不同的代码页用于 JCICS,请在 JVM 概要文件中设置 -Dcom.cics.jvmserver.override.ccsid= 参数。
    3. 如果要在 JVM 概要文件中使用 -Dcom.cics.jvmserver.override.ccsid= 参数,请确保 CCSID 是 EBCDIC 代码页。 在使用 JCICS 调用时,应用程序必须使用 EBCDIC。
    4. 如果要在 Axis2 JVM 服务器中运行 SOAP 处理,请确保 -Dfile.encoding JVM 属性指定 EBCDIC 属性。
      如果指定非 EBCDIC 代码页,例如,UTF-8,那么 Web Service 请求失败并且响应包含损坏的数据。
  6. 如果遇到启动超时或工作负载超时,那么可调整各种参数来帮助解决问题。 以下内容指示您可以调整的值:
    • 修改 -Dcom.ibm.cics.jvmserver.threadjoin.timeout 设置以控制 HTTP 请求等待获取 JVM 服务器线程的时间长度。
    • 提高 JVMSERVER 资源上的 THREADLIMIT 值。
    • 如果 THREADLIMIT 已设置为允许的最大值,那么您尝试运行的工作可能要多于单个 JVM 服务器可处理的工作。 考虑均衡多个 JVM 服务器或多个区域之间的工作负载。

      或者,由于其他约束,您的 CICS 系统可能无响应。 遵循标准过程来诊断性能问题。 请参阅 提高 CICS 系统的性能

  7. 如果 JVM 服务器在发出 DISABLED PHASEOUT 后处于禁用状态,请执行以下任何操作:
    • 查看 JVMLOG 以了解 CICS 是否正在报告任何仍在运行的非守护程序线程。 直到完成所有非守护程序线程以允许从 JVM 服务器中排出工作之后, PHASEOUT 才会完成。 如果非守护程序线程仍在运行,请确保应用程序在不再需要它们时终止它们,或者在它们未执行重要功能时将它们设置为守护程序。

    • 您可以使用 PURGE、FORCEPURGE 或 KILL 选项发布 SET JVMSERVER DISABLED 命令,禁用 JVM 服务器。 这些选项可能导致异常终止或 CICS 异常终止,因此应谨慎使用。

下一步操作

如果无法解决问题原因,请联系 IBM 支持人员。 请确保提供所需信息,如 收集 CICS 故障诊断数据 (CICS MustGather) 中所列,供 IBM 支持人员 用于报告 Java 问题。