IBM 的 Java 诊断,第 1 部分: 介绍面向 Java 的 IBM 转储分析器(IBM Dump Analyzer)

透过纷扰的转储文件直达问题核心

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

本文介绍 IBM Dump Analyzer for Java,并提供该工具所能诊断的各种类型问题的背景信息。 它阐述了 IBM Dump Analyzer for Java 所基于的体系结构,对其未来发展方向做了一定思考。

Helen Beeken, 软件工程师, IBM

Helen BeekenHelen Beeken 博士是一位工作于 IBM Java 技术中心的软件工程师,正致力于开发 RAS 工具。 在加入该团队之前,她效力于开源项目 AspectJ 和 AJDT Eclipse,并帮助针对大型软件系统进行压力测试。



Daniel Julin, 软件工程师, IBM

Author photoDaniel Julin 在复杂在线系统的开发和故障排除方面具备长达 20 年的经验。作为 WebSphere Serviceability 团队的技术主管,他最近倾力于帮助团队定义并实现一组工具和技术,以便对 WebSphere Serviceability Server 进行问题诊断时提供帮助,并最大限度地提高 IBM 支持效率。他有时还直接为各种关键的用户支持场景提供帮助。


developerWorks 投稿作者

Julie Stalley, 软件工程师, IBM

Julie StalleyJulie Stalley 是一名软件工程师,目前是位于 Hrusley 的 Java RAS Tooling 团队的一员。她于 1996 年加入 IBM,并且五年时间内一直开发一套大型客户机/服务器应用程序,此后于 2001 年转到 Hursley。此后她主要研究 Java 类库,特别是 I/O、网络和 XML。



Martin Trotter, 软件工程师, IBM

Martin Trotter photoMartin Trotter 在 Java 平台出现的早期就已介入,主要针对 Java VM 和垃圾收集器。他现在致力于提升诊断 Java VM 问题的工具的性能。



2007 年 10 月 29 日

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 将报告如下四项内容之一:

关于本系列

IBM 的 Java 诊断介绍了来自 IBM 的新工具,可帮助解决 Java 应用程序中的问题并提高性能。您可从每篇文章学到新的知识,并且马上就可以投入使用。

为本系列投稿的每位作者都属于一个新团队,它致力于 创建新工具帮助您解决 Java 应用程序的问题。每位作者都有着不同的知识背景,并为团队带来各种技能和专业领域的知识。

您可以单独联系各个作者,讨论您对这些文章的评论或问题。

  • 内存不足
  • 死锁检测
  • 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;您将在本文的后面部分进一步了解) 的工具,设计为分析系统转储并查找各种类型的问题。 该工具由很多小的分析模块组成,这些模块查看特定的转储数据并确定 是否存在特殊问题(例如,死锁)。该设计可以轻松容纳其他新功能并且可以进行定制以查找特定问题。

该工具在两个级别运行:

  • 每个具体的分析模块都尝试诊断一个特定的问题类型 并生成一个简单说明描述已发现的问题。
  • 当不能进行诊断时,每个分析模块都会生成一个有关系统状态的某个方面的 详细报告。故障诊断专家可以使用该报告, 也可以将该报告与其他信息结合使用以诊断问题。

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

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

  1. 工具加载用户所选择的转储数据以创建用于进行进一步分析的图像。
  2. 用户根据该图像选择要运行的一个或多个分析模块;如果用户没有选择具体的分析器,则运行默认的脚本。
  3. 运行分析模块。
  4. 每个模块返回控制更详细的分析流程的信息或将该信息生成一个报告。
  5. 所有模块都已完成其运行之后,将该报告格式化为 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

关于 IBM Support Assistant

IBM Support Assistant 是一个免费的软件适用性工作平台,它帮助您解决 IBM 软件产品的问题。ISA 具有一个搜索工具,该工具能够跨越大量的 IBM 文档并对结果进行分类以便进行查看。

它还提供一个产品信息功能,具有到产品支持和主页、故障诊断指南以及各种论坛和新闻组的链接。ISA 的服务功能可以从您的桌面收集信息并且可以轻松为 IBM 创建一个问题报告。

ISA 的工具工作平台提供问题确定工具,帮助解决 IBM 产品的问题。这些工具将不断更新,并且使您能够在桌面上运行故障排除和诊断工具。请参阅 参考资料获得 ISA 下载链接。

TDump Analyzer 的主要发行工具是 IBM Support Assistant (之后称为 ISA)。ISA 可用于所有内部 IBM 用户和外部客户 (请参阅 参考资料部分获得下载链接)。

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

  1. 确保安装了版本 3 的 ISA。
  2. 若要安装 Dump Analyzer,您必须安装与其相关的一个产品插件 —例如,IBM Developer Kit for Java。 (请参阅 参考资料部分获得相关说明。)
  3. 重新启动 ISA 客户机。现在您可以安装工具插件。
  4. 转到 Updater 服务。有两种方法可以实现:
    • 单击 Welcome 页面上的 Updater图标。
    • 单击菜单栏上的 Updater链接。
  5. 选择 New Plug-ins选项卡并等待 ISA 构建可用于安装的插件编目。
  6. 打开 Common Component Tools文件夹。
  7. 选择 IBM Dump Analyzer for Java (Tech Preview)并安装。

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

  1. 重新启动 ISA。
  2. 选择 Tools
  3. 选择 Dump Analyzer 可用的产品 —例如,IBM Developer Kit for Java。
  4. 单击 IBM Dump Analyzer for Java (Tech Preview)即可启动该工具。您的屏幕 应该如图 1 所示:
图 1. ISA 中的 Dump Analyzer
ISA 中的 Dump Analyzer

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

  1. 输入合格的系统转储名称以进行分析(该系统转储已执行过格式化)。
  2. 单击 Estimate Time即可收到分析所需时间的大概估计。
  3. 单击 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 的命令步骤:

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

下面是 Linux 的步骤:

  1. export CP=WEB-INF/lib/dumpAnalyzer.jar
  2. export BCP=WEB-INF/lib/j9/dtfj.jar:WEB-INF/lib/j9/dtfj-interface.jar:
    WEB-INF/lib/sov/dtfj.jar
  3. 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 命令行输出示例
Dump Analyzer 命令行输出示例

有关 DTFJ 的详细信息,请参阅 参考资料一节。

未来计划

编写本文时,已经可以使用 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 SDKs and Runtimes:访问该论坛,讨论与 IBM Developer Kits for the Java Platform 有关的问题。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=265374
ArticleTitle=IBM 的 Java 诊断,第 1 部分: 介绍面向 Java 的 IBM 转储分析器(IBM Dump Analyzer)
publish-date=10292007