IBM的Java诊断,第1部分

介绍面向 Java 的 IBM 转储分析器(IBM Dump Analyzer)

简介:Java™ 应用程序已经变得越来越复杂;因此,对这些应用程序进行问题诊断变得不再轻 松,并且可能需要某个外部服务组织做大量的工作。若能够指明正确的方向将节省时间和费用。IBM Dump Analyzer for Java 工具可以对格式化的系统转储做基本分析并生成简明的报告,指导您如何进行下一步 操作。

Java 语言已经成为软件开发中的主导语言,因此, Java 虚拟机(VM)的稳定性成为一个 非常重要的问题。VM 通常是一种可靠的软件,但是出于各种原因在运行时还是会发生错误。这些问题中 的少数是由于 VM 自身错误导致;但是在大多数情况下,导致问题的原因是由于 VM(比如 IBM® WebSphere® Application Server)之上的软件堆栈或应用程序本身的错误或配置不当。

随着信息技术的成熟,一个典型项目的软件堆栈变得日益复杂,这也导致开发人员确定问题原因的难 度日益增大。在这么一个复杂的环境下,您为了诊断一个错误,可能要面对大量的信息。在生产环境中, 可能要面对以 GB 字节计算的堆,数以百计的线程,数以千计的类加载器,数以万计的类以及巨大数目的 对象。

IBM Dump Analyzer for Java(此后称为 Dump Analyzer)是为解决此困难而出现的一种 可扩展框架。所有内部 IBM 用户和外部客户都可以使用它,配合 IBM 的 Java 平台开发包(IBM SDK) 来诊断问题。它用分析器 审查格式化的系统转储(每个分析器对转储执行一个特定询问)并用脚本把结 果连接起来形成一个简明的分析报告。其最早的两个版本中,Dump Analyzer 将报告如下四项内容之一:

内存不足

死锁检测

VM 得到信号而终止(由于内部或中间件/Java 应用程序错误)

需要执行进一步调查

前三项都可映射到某类 VM 问题,这些问题在本文的下一节阐述。

阅读本文后面的内容并不需要背景知识。您可以获得使用 Dump Analyzer 分析系统转储的分步指导, 同时从较高层次大致了解该工具及其体系结构。阅读完本文后,您应当能够深刻地理解在何种情况下需要 使用 Dump Analyzer,并对其基础架构有一定的了解。

从较高层次查看 VM 问题类型

VM 在执行时出现的故障可能有多种方式,每种故障都需要不同的诊断方法。在您详细了解 Dump Analyzer 的工作之前,有必要检视这些不同类型的问题以及为解决它们所需要做的分析。

内存不足

VM 可能由于内存不足而失败 — VM 使用 Java 堆内存或本地内存来存放线程堆栈、类信息、JIT 代 码、图像元素以及其它与操作系统交互所需的器件。

诊断此类问题可能会异常困难,因为导致问题的内存分配本身并非罪魁祸首;某个大的内存集合可能 一直在增长,直到 VM 最终耗尽所有可用堆空间。通常,需要检查堆的内容并将不同时期的堆快照进行对 比,从而才能确定快速增长的内存集合。

死锁

所谓死锁,是指两个以上的进程之间互相等待对方释放资源。某个占有资源的线程(如监视器)无法 获得另一资源的所有权,因为该资源被另一线程所有而且它正在试图获得第一个线程占用的资源的所有权 。这种错误经常表现为性能问题。相对而言这比较容易诊断,只需检查线程状态以及它们所拥有的资源。

内部错误

导致内部错误的原因包括:

本机代码可能尝试访问具有无效输入(如过时的本地引用)或编码错误的对象。

垃圾收集器可能错误地收回某些存储,当引用这些存储时,似乎包含到尚未初始化内存的指针。

JIT 编译器可能生成错误代码,该代码引用或尝试对无效的位置进行分支。

Java 应用程序或中间件的错误

Dump Analyzer 目前处理在 VM 自身发生或检测到的错误,但最终这些工具集将能够诊断在 VM 中运 行的 Java 应用程序或中间件中的各种错误和不正确的行为。发生这些错误有各种潜在的原因;它们通常 是由于应用程序或中间件代码中的缺陷或 JVM 选项的错误配置造成的。一般,通常检查应用程序或中间 件中各种数据结构的状态即可确定该状态的错误因素。

当前的问题诊断情况

如果没有像 Dump Analyzer 这样的工具,您通常会首先检查故障点处 VM 生成的产物, 从而开始诊 断问题。通常,它们是:

进程空间转储(系统转储或核心文件)

Java 堆转储(堆转储)

Java 进程快照(Javacore 文件)

显示某些执行历史记录的跟踪文件

通常,您应该使用每种特定格式的专门程序分别检查这些产物。那么确定问题的过程主要是手动检查 可用的信息。随着数据量的增加,该过程变得越来越费时,工作变得越来越专业。因此,客户通常不愿意 自己执行分析,而是依赖他们的 VM 或中间件供应商来执行该操作,但报告的大多数问题最终都被诊断为 应用程序、配置或环境问题,这些问题不需要对 VM 或中间件本身的代码进行任何更改。理想情况下,客 户可用的诊断功能将确保只将需要更改代码的缺陷报告给 VM 或中间件供应商。其他问题将使用 VM 生成 的相应产物自动进行诊断。

Dump Analyzer 概述

Dump Analyzer 是一个基于 Diagnostic Tooling Framework for Java(DTFJ;您将在本文的后面部 分进一步了解)的工具,设计为分析系统转储并查找各种类型的问题。该工具由很多小的分析模块组成, 这些模块查看特定的转储数据并确定是否存在特殊问题(例如,死锁)。该设计可以轻松容纳其他新功能 并且可以进行定制以查找特定问题。

该工具在两个级别运行:

每个具体的分析模块都尝试诊断一个特定的问题类型 并生成一个简单说明描述已发现的问题。

当不能进行诊断时,每个分析模块都会生成一个有关系统状态的某个方面的 详细报告。故障诊断专家 可以使用该报告, 也可以将该报告与其他信息结合使用以诊断问题。

为了进一步增加灵活性,使用简单脚本语言来控制分析流程。 我们的团队计划将来通过提供很多不同 的脚本来开发此实用工具。

下面是该工具的分析流程:

工具加载用户所选择的转储数据以创建用于进行进一步分析的图像。

用户根据该图像选择要运行的一个或多个分析模块;如果用户没有选择具体的分析器,则运行默认的 脚本。

运行分析模块。

每个模块返回控制更详细的分析流程的信息或将该信息生成一个报告。

所有模块都已完成其运行之后,将该报告格式化为 HTML 或文本文档。

如上所述,如果用户没有请求具体的分析模块,则该工具运行默认的脚本 (general.sml),该脚本运 行一组检查几种常见问题类型的分析器。如果这些问题都没有检测到,则脚本调用默认的报告,它介绍有 关生成转储时 VM 状态的某些常规信息。

在本文的后面部分,您将看到一个使用 Dump Analyzer 的示例,并大致了解一些可选的非默认的分析 模块。

使用 Dump Analyzer 所需的设置

所有 Dump Analyzer 所需的就是运行格式化的系统转储。系统转储在 VM 崩溃时默认发生;但是可以 配置 VM 以创建在其他故障情况下的转储或用户请求时的转储。

若要格式化系统转储,您需要针对其运行 jextract 工具。在生成转储的相同机器上使用相同的 VM, 只需运行以下命令行:

jextract ”corefilename”

借助 1.4.2 级别的 VM,该命令生成一个 .sdff 文件;在版本 5.0 或更高版本的 VM 上,它生成一 个 .dmp.zip 文件。另请注意,在不同的平台上,可能提供了不同的选项控制在操作系统级别生成的转储 的格式。尤其有一些选项会造成系统转储中断从而导致 Dump Analyzer 不会生成有用的诊断。最常见的 错误(在 UNIX® 系统上)是忘记将 ulimit 设置为 unlimited,而在其他平台上也有其他重要选项 。为了避免此类问题,请参考 IBM 诊断指南中的信息或搜索 IBM 软件支持网站以使用关键词 “truncated core” 获得特定平台的技术说明。

在 IBM Support Assistant 内使用 Dump Analyzer

TDump Analyzer 的主要发行工具是 IBM Support Assistant (之后称为 ISA)。ISA 可用于所有内部 IBM 用户和外部客户。

您可以按 照如下方式安装 Dump Analyzer 和 ISA:

确保安装了版本 3 的 ISA。

若要安装 Dump Analyzer,您必须安装与其相关的一个产品插件 — 例如,IBM Developer Kit for Java。

重新启动 ISA 客户机。现在您可以安装工具插件。

转到 Updater 服务。有两种方法可以 实现:

单击 Welcome 页面上的 Updater 图标。

单击菜单栏上的 Updater 链接。

选择 New Plug-ins 选项卡并等待 ISA 构建可用于安装的插件编目。

打开 Common Component Tools 文件夹。

选择 IBM Dump Analyzer for Java (Tech Preview) 并安装。

安装完 Dump Analyzer 之后,您可以从 ISA 中启动它:

重新启动 ISA。

选择 Tools。

选择 Dump Analyzer 可用的产品 — 例如,IBM Developer Kit for Java。

单击 IBM Dump Analyzer for Java (Tech Preview) 即可启动该工具。您的屏幕 应该如图 1 所示:

图 1. ISA 中的 Dump Analyzer

下面是如何分析格式化的系统转储:

输入合格的系统转储名称以进行分析(该系统转储已执行过格式化)。

单击 Estimate Time 即可收到分析所需时间的大概估计。

单击 Analyze。完成后结果将出现在窗口中。

图 2 显示 Dump Analyzer 生成的错误摘要示例:

图 2. 错误摘要示例

单击 Analyze Another 返回到如图 1 所示的屏幕,仍然在第一个文本框中输入以前输入的转储文件 名称。

选择分析模块

图 1 和 2 中调用屏幕的标签为 Optional Parameters 的字段控制将执行的分析程序集,以及其他运 行时选项。通常,您应该将该字段保留为空;这样将执行默认的分析脚本 general.sml。该脚本检查最常 见的问题类型。但是,如果已经知道所调查问题的具体类型,或者您需要解决未集成到默认脚本中的问题 ,则可以明确指定要调用的一个或多个分析程序。可以通过特定脚本文件的名称或特定分析程序模块的类 名称来调用这些分析程序。在 Optional Parameters 字段中键入 -help 将列出更详细的运行时选项。

在第一个版本的工具中,除了默认的脚本之外,只提供非常少量的试验分析程序。它们包括:

DefaultDumpReport(类名:com.ibm.dtfj.analyzer.deal.basic.DefaultDumpReport): 该分析程 序生成关于 VM 状态的所有主要方面的详细报告, 有点类似于 Javacore 文件的内容(但还包含其他一 些特定于 DTFJ 的信息)。

ListZipJars(类名:com.ibm.dtfj.analyzer.deal.extended.ListZipJars):该试验性分析程序尝 试发现 VM 内当前打开的所有 zip 和 JAR 文件,它们可能提供对应用程序或中间件所使用的任何自定义 库的深入分析。

SystemProperties(类名:com.ibm.dtfj.analyzer.deal.extended.SystemProperties): 该试验性 分析程序扫描 VM 并打印在该 VM 中定义的每个 Java 系统属性的当前值。

WASBasicInfo(类名:com.ibm.dtfj.analyzer.deal.was.WASBasicInfo): 这是一个非常初级而且 是试验版本的分析程序,它演示使用该工具检查在 VM 内部执行的 WebSphere Application Server 运行 时的状态。

当前提供的这些额外的分析程序几乎都演示了该工具的灵活性。将来将发布很多其他专门的分析程序 以及文档。此外,在本系列的第四篇文章中,您将学习如何编写您自己的分析程序以补充该工具本身所提 供的那些分析程序。

从命令行使用 Dump Analyzer

在某些情况下,您可能会发现从命令行运行 Dump Analyzer 非常有帮助(例如,如果需要将分析合并 到某些现有的问题处理工作流程中)。使用 Dump Analyzer 的最简单方法是通过 ISA,您已经看到如何 下载 ISA 中的 Dump Analyzer。

若要单独运行 Dump Analyzer,需要四个 JAR 文件和一个脚本文件。它们是:

dumpAnalyzer.jar(位于 installDir/plugins/com.ibm.java.diagnostics.dbda.isa_(version number)/WEB-INF/lib 中)

dtfj-interface.jar(位于 installDir/plugins/com.ibm.java.diagnostics.dbda.isa_(version number)/WEB-INF/lib/j9 中)

用于 Java 5.0 和更高版本的 dtfj.jar(位于 installDir/plugins/com.ibm.java.diagnostics.dbda.isa_(version number)/WEB-INF/lib/j9 中)

用于 Java 1.4.2 的 dtfj.jar (位于 installDir/plugins/com.ibm.java.diagnostics.dbda.isa_(version number)/WEB-INF/lib/sov 中)

general.sml(位于 installDir/plugins/com.ibm.java.diagnostics.dbda.isa_(version number) 中)

在所有这些文件路径中,installDir 表示 ISA 安装目录;默认情况下为 C:/Program Files/IBM/IBM Support Assistant v3 on Microsoft Windows 或 /opt/IBM/IBM Support Assistant v3 on Linux™。您可以在其他位置复制这些文件,也可以从 installDir/plugins/com.ibm.java.diagnostics.dbda.isa_(version number) 目录直接运行 Dump Analyzer。尽管 ISA 只能在 Windows 和 Linux 上使用,但是您可以从任何平台的命令行运行 Dump Analyzer。

下面是从 Windows 上的默认目录运行 Dump Analyzer 的命令步骤:

set CP=WEB- INF/lib/dumpAnalyzer.jarset BCP=WEB-INF/lib/j9/dtfj.jar;WEB-INF/lib/j9/dtfj- interface.jar;WEB-INF/lib/sov/dtfj.jarjava -cp %CP% -Xbootclasspath/p:%BCP% com.ibm.dtfj.analyzer.base.DumpAnalyzer (dumpName) (options)

下面是 Linux 的步 骤:

export CP=WEB-INF/lib/dumpAnalyzer.jarexport BCP=WEB- INF/lib/j9/dtfj.jar:WEB-INF/lib/j9/dtfj-interface.jar:WEB-INF/lib/sov/dtfj.jarjava -cp $CP -Xbootclasspath/p:$BCP com.ibm.dtfj.analyzer.base.DumpAnalyzer (dumpName) (options)

其中,dumpName 是要分析的完全合格的转储名称,options 是可以用于配置 Dump Analyzer 的运行 时参数。运行 -help 选项将打印所有可用参数的列表。

图 3 中的快照显示了运行在命令行的 Dump Analyzer 的一些输出:

图 3. Dump Analyzer 命令行输出示例

未来计划

编写本文时,已经可以使用 Dump Analyzer 的初始版。我们的团队计划继续定期进行修改和更新。尤 其是,我们将侧重两个区域:

DTFJ:Dump Analyzer 的基础架构

Dump Analyzer 使用 DTFJ 询问格式化的系统转储。DTFJ 是一个 API,它支持构建 Java 诊断工具, 这些工具可以检查从 VM 中获取的系统转储。检查系统转储之前,jextract 必须首先对其进行处理 以添 加特定于运行时的信息。有必要使用相同版本的 Java 平台针对系统转储(命令行上的 jextract core.dmp)运行 jextract,并且在生成该系统转储的相同机器上运行。执行该操作之后,便可以在任何 系统上检查所得到的文件(V1.4 的 Java 平台为 .sdff,V5.0 和更高版本的 Java 平台为 .dmp.zip) 。

使用 DTFJ 进行分析的第一阶段是使用适当的图像工厂构建 DTFJ 图像。该工厂特定于给定的 VM 级 别并且理解特定平台的转储格式。该图像表示整个操作系统图像;对于生成系统转储的机器,它可以提供 方法来访问有关该机器的基础架构的信息, 但是它的主要功能是 能够检查图像内包含的地址空间。使用 DTFJ API,可以从图像导航到运行时参数、 Java 线程、本机环境以及堆对象的详细信息。界面允许工具 分析问题并生成报告信息。

我们将不断改进该工具本身的用户界面、添加面板以控制转储 以及运行转储的分析程序、改进输出格 式、可能添加交互模式以及更多内容。

我们将增加分析程序和脚本的数量以包含更加广泛的问题。

构建新的分析程序,这一领域非常吸引人。借助此项 DTFJ 转储分析技术,您现在便拥有一个非常简 单的机制,可以检查低级 VM 条目(如线程和监视器)以便诊断内存不足错误、崩溃、死锁等问题;此外 ,还可以检查 VM 中出现的任何数据结构的内容。特别是,您可以检查各种数据结构的内容,它们构成了 运行在 VM 内的应用程序或中间件的实现。我们打算开始构建一个分析程序集合,它将利用这些信息帮助 诊断 WebSphere Application Server 以及可能的其他堆栈产品中的各种问题。

我们的目标是使该工具尽可能有用,因此非常欢迎您提供有关该工具本身以及您希望添加的新分析程 序的反馈。可以通过 ISA 或本文提供反馈。

结束语

本系列的下篇文章将介绍 Extensible Verbose Toolkit。该工具套件通过分析详细的垃圾收集日志 帮助您调查基于内存的 Java 性能问题。您可以使用该工具查看内存使用模式、确定是否存在内存泄露或 调整垃圾收集配置以提高性能。

在本系列的第四篇文章中您将再次接触 Dump Analyzer。在该文章中,您将进一步了解该工具的可扩 展性以及如何为其构建自己的分析模块。

人生才会更有意义。如果没有梦想,那就托做庸人。

IBM的Java诊断,第1部分

相关文章:

你感兴趣的文章:

标签云: