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 在执行时出现的故障可能有多种方式,每种故障都需要不同的诊断方法。 在您详细了解 Dump Analyzer 的工作之前,有必要检视这些不同类型的问题以及为解决它们所需要做的分析。
VM 可能由于内存不足而失败 —VM 使用 Java 堆内存或本地内存来存放 线程堆栈、类信息、JIT 代码、图像元素以及其它与操作系统交互所需的器件。
诊断此类问题可能会异常困难,因为导致问题的内存分配本身并非罪魁祸首;某个大的内存集合可能一直在增长,直到 VM 最终耗尽所有可用堆空间。通常,需要检查堆的内容并将不同时期的堆快照进行对比,从而才能确定快速增长的内存集合。
所谓 死锁,是指两个以上的进程之间互相等待对方释放资源。 某个占有资源的线程(如监视器)无法获得另一资源的所有权,因为该资源被另一线程所有而且它正在试图获得第一个线程占用的资源的所有权。 这种错误经常表现为性能问题。相对而言这比较容易诊断,只需检查线程状态以及它们所拥有的资源。
导致内部错误的原因包括:
- 本机代码可能尝试访问具有无效输入(如过时的本地引用)或编码错误的对象。
- 垃圾收集器可能错误地收回某些存储,当引用这些存储时,似乎包含到尚未初始化内存的指针。
- JIT 编译器可能生成错误代码,该代码引用或尝试对无效的位置进行分支。
Dump Analyzer 目前处理在 VM 自身发生或检测到的错误, 但最终这些工具集将能够诊断在 VM 中运行的 Java 应用程序或中间件中的各种错误和不正确的行为。发生这些错误有各种潜在的 原因;它们通常是由于应用程序或中间件代码中的缺陷或 JVM 选项的错误配置造成的。一般,通常检查应用程序或中间件中各种数据结构的状态即可确定该状态的错误因素。
如果没有像 Dump Analyzer 这样的工具,您通常会首先检查故障点处 VM 生成的产物, 从而开始诊断问题。通常,它们是:
- 进程空间转储(系统转储或核心文件)
- Java 堆转储(堆转储)
- Java 进程快照(Javacore 文件)
- 显示某些执行历史记录的跟踪文件
通常,您应该使用每种特定格式的专门程序分别检查这些产物。 那么确定问题的过程主要是手动检查可用的信息。随着数据量的增加, 该过程变得越来越费时,工作变得越来越专业。 因此,客户通常不愿意自己执行分析,而是依赖 他们的 VM 或中间件供应商来执行该操作,但 报告的大多数问题最终都被诊断为应用程序、 配置或环境问题,这些问题不需要对 VM 或中间件本身的代码进行任何更改。理想情况下,客户可用的 诊断功能将确保只将需要更改代码的 缺陷报告给 VM 或中间件供应商。其他问题将使用 VM 生成 的相应产物自动进行诊断。
Dump Analyzer 是一个基于 Diagnostic Tooling Framework for Java(DTFJ;您将在本文的后面部分进一步了解) 的工具,设计为分析系统转储并查找各种类型的问题。 该工具由很多小的分析模块组成,这些模块查看特定的转储数据并确定 是否存在特殊问题(例如,死锁)。该设计可以轻松容纳其他新功能并且可以进行定制以查找特定问题。
该工具在两个级别运行:
- 每个具体的分析模块都尝试诊断一个特定的问题类型
并生成一个简单说明描述已发现的问题。
- 当不能进行诊断时,每个分析模块都会生成一个有关系统状态的某个方面的 详细报告。故障诊断专家可以使用该报告, 也可以将该报告与其他信息结合使用以诊断问题。
为了进一步增加灵活性,使用简单脚本语言来控制分析流程。 我们的团队计划将来通过提供很多不同的脚本来开发此实用工具。
下面是该工具的分析流程:
- 工具加载用户所选择的转储数据以创建用于进行进一步分析的图像。
- 用户根据该图像选择要运行的一个或多个分析模块;如果用户没有选择具体的分析器,则运行默认的脚本。
- 运行分析模块。
- 每个模块返回控制更详细的分析流程的信息或将该信息生成一个报告。
- 所有模块都已完成其运行之后,将该报告格式化为 HTML 或文本文档。
如上所述,如果用户没有请求具体的分析模块,则该工具运行 默认的脚本 (general.sml),该脚本运行一组检查 几种常见问题类型的分析器。如果这些问题都没有检测到, 则脚本调用默认的报告,它介绍有关 生成转储时 VM 状态的某些常规信息。
在本文的后面部分,您将看到一个使用 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 的最简单方法是通过 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.jar -
set BCP=WEB-INF/lib/j9/dtfj.jar;WEB-INF/lib/j9/dtfj-interface.jar;
WEB-INF/lib/sov/dtfj.jar -
java -cp %CP% -Xbootclasspath/p:%BCP% com.ibm.dtfj.analyzer.base.DumpAnalyzer
(dumpName) (options)
下面是 Linux 的步骤:
-
export CP=WEB-INF/lib/dumpAnalyzer.jar -
export BCP=WEB-INF/lib/j9/dtfj.jar:WEB-INF/lib/j9/dtfj-interface.jar:
WEB-INF/lib/sov/dtfj.jar -
java -cp $CP -Xbootclasspath/p:$BCP com.ibm.dtfj.analyzer.base.DumpAnalyzer
(dumpName) (options)
其中,dumpName是要分析的完全合格的转储名称,options是可以用于配置
Dump Analyzer 的运行时参数。运行 -help选项将打印所有可用参数的列表。
图 3 中的快照显示了运行在命令行的 Dump Analyzer 的一些输出:
图 3. Dump Analyzer 命令行输出示例
有关 DTFJ 的详细信息,请参阅 参考资料一节。
编写本文时,已经可以使用 Dump Analyzer 的初始版。我们的团队计划 继续定期进行修改和更新。尤其是, 我们将侧重两个区域:
- 我们将不断改进该工具本身的用户界面、添加面板以控制转储
以及运行转储的分析程序、改进输出格式、可能添加交互模式以及更多内容。
- 我们将增加分析程序和脚本的数量以包含更加广泛的问题。
构建新的分析程序,这一领域非常吸引人。借助此项 DTFJ 转储分析技术,您现在便拥有一个非常简单的机制,可以检查低级 VM 条目(如线程和监视器)以便诊断内存不足错误、崩溃、死锁等问题;此外,还可以检查 VM 中出现的任何数据结构的内容。特别是,您可以检查各种数据结构的内容,它们构成了运行在 VM 内的应用程序或中间件的实现。 我们打算开始构建一个分析程序集合,它将利用这些信息帮助诊断 WebSphere Application Server 以及可能的其他堆栈产品中的各种问题。
我们的目标是使该工具尽可能有用,因此非常欢迎您提供有关该工具本身以及您希望添加的新分析程序的反馈。可以通过 ISA 或本文提供反馈。
本系列的下篇文章将介绍 Extensible Verbose Toolkit。该工具套件通过分析详细的垃圾收集日志 帮助您调查基于内存的 Java 性能问题。您可以使用该工具查看内存使用模式、确定是否存在内存泄露或调整垃圾收集配置以提高性能。
在本系列的第四篇文章中您将再次接触 Dump Analyzer。在该文章中,您将进一步了解该工具的可扩展性以及如何为其构建自己的分析模块。
学习
-
IBM 的 Java 诊断
:阅读本系列中的所有文章。
-
诊断指南
1.4.2:提供 IBM 有关 1.4.2 版 Java 平台实现的功能诊断信息。
-
诊断指南
5.0:提供 IBM 有关 5.0 版 Java 平台实现的功能诊断信息。
-
IBM
软件支持网站:下载 Runtimes for Java Technology。
-
“Java 技术,IBM 风格:监视和问题确定”(Chris Bailey 和 Simon Rowland,developerWorks,2006 年 6)提供了一些对问题分析过程的深入分析并介绍了 DTFJ。
获得产品和技术
-
IBM
Support Assistant:下载 ISA 并开始调整当前的 Java 应用程序。还可以查找有关在 ISA 中 安装产品插件的信息。
-
IBM Developer Kits for the Java
Platform:从此页下载用于 AIX®、Linux 和 z/OS®的 SDK 以及其他面向 Java 技术的 IBM 开发人员工具包。
讨论
-
IBM SDKs and Runtimes:访问该论坛,讨论与 IBM Developer Kits for the Java Platform 有关的问题。

Helen Beeken 博士是一位工作于 IBM Java 技术中心的软件工程师,正致力于开发 RAS 工具。 在加入该团队之前,她效力于开源项目 AspectJ 和 AJDT Eclipse,并帮助针对大型软件系统进行压力测试。
Daniel Julin 在复杂在线系统的开发和故障排除方面具备长达 20 年的经验。作为 WebSphere Serviceability 团队的技术主管,他最近倾力于帮助团队定义并实现一组工具和技术,以便对 WebSphere Serviceability Server 进行问题诊断时提供帮助,并最大限度地提高 IBM 支持效率。他有时还直接为各种关键的用户支持场景提供帮助。

