内容


权威支持

Memory Analyzer(及其 IBM Extensions 插件)为何不再只用于内存泄露

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 权威支持

敬请期待该系列的后续内容。

此内容是该系列的一部分:权威支持

敬请期待该系列的后续内容。

在每个专栏中,支持权威将讨论 IBM® Technical Support 的可用于 WebSphere ® 产品的资源、工具和其他元素,以及一些可以进一步增强您的 IBM 支持体验的技术和新思想。

最新快报

按照惯例,我们将首先提供关于整个 WebSphere 社区的一些重要新闻:

  • 您准备好参加 Impact 2011 了吗?加入 Impact 2011:2010 年 4 月 10-15,内华达州拉斯维加斯,The Venetian and The Palazzo Hotels。阅读 参加 Impact 的 5 个最大理由(PDF,115KB),体验这个商界领袖和 IT 领袖齐聚一堂、探讨如何实现更大的业务灵活性的会议。
  • 查阅 IBM Conferences and Events 页面,获取即将举行的会议列表。
  • 在 developerWorks 上的 IBM Electronic Support Community 博客 学习、共享并联网。
  • websphereusergroup.org 查看新的 Global WebSphere Community (GWC)。定制您的个人 GWC 页面上的内容,连接与您志趣相投的其他 “WebSphere 人”。GWC 还提供一个 免费 IBM WebSphere CloudBurst™ Appliance 培训课程。学习如何配置云中托管的资源,创建部署到云的虚拟系统,管理部署到云的资源,创建一个多映像模式,管理多台动态机器。
  • WebSphere Technical Exchange 将在未来几个月安排一些令人兴奋的网络广播。请查看此站点了解详细信息,也可以通过 Facebook 成为一名粉丝!
  • IBM Support Assistant 4.1.2 现在已可用。 IBM Support Assistant 4.1.2 提供了几个缺陷修复程序和它的快速数据收集工具 ISA Lite 的一个新版本。ISA Lite 中现在可用的新特性包括:
    • 可以在浏览器中轻松查看 ISA Lite 中收集的库存。
    • 利用 Ant 1.8。
    • 已编号的菜单选项。
    • 可以在多个不同的场景中暂停一个响应文件的处理。
    • ISA Lite 现在拥有一种更灵活的可扩展格式(对响应文件使用 “名称-值” 对),它支持:在响应文件中添加注释;响应文件包含涵盖所有相关问题的 “名称-值” 对;针对系统定制轻松编辑响应文件。
    • 版本信息在启动时自动写入控制台和日志。
    • 一个 -help 选项用于查看关于如何使用工具的信息。
    • 替代文件传输选项。
    • 一个可视指示符显示收集是否成功完成。
    • 一个 -useHome 选项用于阻止文件写入 ISA Lite 安装目录。
    • 对 Windows® 7 和 64 位 Linux® RedHat 的支持。
    • 为 Solaris 添加了库存收集支持。

继续关注 与支持相关的各个网站 以及本专栏,了解我们所遇到的其他工具的相关新闻。

现在,让我们言归正传......

从转储进行调试

在一篇关于 从转储进行调试 的 IBM developerWorks 配套文章中,我们介绍了这样一个概念:使用 IBM Monitoring and Diagnostics for Java - Memory Analyzer 工具(以下简称 Memory Analyzer),结合来自一个基于 HotSpot 的 Java 运行时(Solaris™ 和 HP-UX)的 HPROF 二进制转储或来自一个 IBM Java 运行时的系统转储,来调试问题而非内存泄露。那篇文章介绍了使用那些转储类型(而不是 IBM Portable Heap Dump)的重要性,如何获取转储,以及如何使用转储诊断几种问题类型,包括足迹和内存效率问题、类加载器层级问题、线程数据使用情况、以及异常分析。

本文介绍如何在 IBM WebSphere Application Server 中生成并启用 HPROF 和 IBM 系统转储,如何使用 Memory Analyzer 和新近可用的 IBM Extensions for Memory Analyzer 插件帮助理解您的 WebSphere Application Server 环境的状态并诊断一些 WebSphere Application Server 特有问题。

在 WebSphere Application Server 中生成转储

要利用 Memory Analyzer 的全部威力,重要的是生成 HPROF 格式转储(如果使用基于 HotSpot 的 Java 运行时)或 IBM 系统转储(如果使用基于 IBM 的 Java 运行时)。这是因为那些转储格式包含一些额外数据,那些数据存储在堆上的 Java 对象中,对于诊断内存泄露之外的问题和创建应用程序状态报告很重要。

尽管 HPROF 和 IBM 系统转储格式包含重要的额外数据,但它们的代价是需要额外的磁盘空间。两种系统转储类型都大于它们表示的 Java 堆的大小,IBM 系统转储等于 Java 进程的总内存大小。这意味着,确保有足够的磁盘空间、防止转储被截断很重要。默认情况下,转储被写入 Java 进程的当前工作目录。在 WebSphere Application Server 中,这是服务器的配置文件目录的路径;例如,WebSphere_Application_Server_Install_Path/profiles/node1。对于 IBM Java 运行时,可以使用 -Xdump 文件命令行选项更改这个位置。对于 HotSpot Java 运行时,使用的是 -XX:HeapDumpPath 命令行选项。

生成系统转储时,还有一点很重要:确保设置了必要的操作系统级设置来支持写入完整的转储。在基于 UNIX® 的系统上,这意味着设置了正确的 ulimits。(参见 参考资料,了解如何从 AIX®、Linux®、z/OS® 和 Solaris 获取系统转储。)

从 HotSpot Java 运行时生成转储

基于 HotSpot 的 Java 运行时只生成 HPROF 格式转储,可以在 OutOfMemoryError 发生时生成,也可以使用下面几种交互式方法生成:

  • 交互式方法
    • 使用一个 Ctrl+Break:如果为正在运行的应用程序设置了 -XX:+HeapDumpOnCtrlBreak 命令行选项,那么当一个 Ctrl+Break 事件或 SIGQUIT(通常使用 kill -3 生成)通过控制台发送时,将生成一个 HPROF 格式转储和一个线程转储。有些版本上可能没有这个选项,如果遇到这种情况,可以尝试以下命令:

      -Xrunhprof:format=b,file=heapdump.hprof

    • 使用 jmap 工具:这个 JDK 的 bin 目录中提供了一个 jmap 实用工具(参见 参考资料),该工具提供一个选项来从正在运行的进程请求 HPROF 转储。对于 Java 5,使用下面的命令:

      jmap -dump:format=b pid

      对于 Java 6,使用下面的命令,其中,“live” 是可选选项,导致只将 “活动” 对象写入转储文件进程 ID(PID):

      jmap -dump[live,]format=b,file=filename pid

    • 使用操作系统:使用非破坏性的 gcore 命令或破坏性的 kill -6kill -11 命令来生成一个核心文件。然后,通过使用 jmap 指向核心转储,从核心文件提取一个堆转储:

      jmap -dump:format=b,file=heap.hprof path

    • 使用 JConsole 工具:JConsole 中的 HotSpotDiagnostic MBean 下方提供了一个 dumpHeap 操作。这个操作请求生成一个 HPROF 堆。
  • 基于事件的方法

    如果为正在运行的应用程序设置了 -XX:+HeapDumpOnCtrlBreak 命令行选项,那么当 OutOfMemoryError 发生时,将生成一个 HPROF 格式转储。这种方法对于生产系统很理想,因为生产系统几乎总是需要诊断内存问题,并且这不会引发任何实时性能开销。这对于每次 JVM 运行时这个事件上生成的堆转储的数量没有限制;在一些较新的发布中,每次 JVM 运行时这个事件上生成的堆转储数量限制为 1。

为您生产中的任何 WebSphere Application Server 部署设置 -XX:+HeapDumpOnOutOfMemoryError 命令行选项是一个好主意。

从 WebSphere Application Server 生成转储

IBM Java 运行时提供一些转储和跟踪引擎,可用于在大量交互式和基于事件的场景中生成 PHD 格式转储或系统转储。也可以使用 Health Center 工具或使用一个 Java API 以编程方式生成交互式转储:

  • 交互式方法
    • 使用一个 SIGQUIT 或 Ctrl+Break:当一个 Ctrl+Break 或 SIGQUIT(通常使用 kill -3生成)被发送到 IBM 运行时,一个用户事件将在 IBM 转储引擎中生成。默认情况下,这个事件只生成一个线程转储文件(javacore.txt)。您可以使用 -Xdump:heap:events=user 选项生成一个 PHD 格式转储,或使用 -Xdump:system:events=user 选项生成一个 Java 应用程序系统转储。
    • 使用操作系统生成一个系统转储:
      • AIX:gencore(或破坏性的 kill -6 or kill -11
      • Linux/Solaris:gcore(或破坏性的 kill -6 or kill -11
      • Windows:userdump.exe
      • z/OS:SVCDUMP 或控制台转储
    • 使用 IBM Monitoring and Diagnostics Tools for Java - Health Center:Health Center 工具提供一个菜单选项来从一个正在运行的 Java 进程请求一个 PHD 转储或系统转储(参见 参考资料)。
    • 使用 wsadmin 脚本客户端:下面的命令使用 Jython 和 -lang jython 选项(参见 参考资料 了解关于连接 wsadmin 并引用目标进程的细节):
      • 线程转储:

        AdminControl.invoke(AdminControl.completeObjectName("type=JVM,process=server1,*"), "dumpThreads")

      • 系统转储:

        AdminControl.invoke(AdminControl.completeObjectName("type=JVM,process=server1,*"), "generateSystemDump")

      • 可移植堆转储(PHD):

        AdminControl.invoke(AdminControl.completeObjectName("type=JVM,process=server1,*"), "generateHeapDump")

        单个 JVM 运行达到 10 个堆转储后,此命令将抛出 HeapDumpOnDiskLimitReachedException(这只适用这个 JMX 命令)。使用下面的命令提高这个限制(这个设置在重启后将失效):

        AdminControl.invoke(AdminControl.completeObjectName("type=JVM,process=server1,*"), "setMaxDumpsOnDisk", "20")

  • 基于事件的方法

    IBM 转储和跟踪引擎提供一个灵活的功能集,在大量事件上生成 PHD 和系统转储,比如正在抛出的异常和正在执行的方法。使用这些功能,应该能够为您想要诊断的大多数问题场景生成转储:

    • 使用 IBM 转储引擎:这个转储引擎提供许多事件,可以在那些事件上生成 PHD 或系统转储;这个引擎还允许过滤那些事件的类型,对何时生成转储提供细粒度控制。这是 OutOfMemoryError 上最常用的设置(在应用程序服务器的泛型 JVM 参数中设置):

      -Xdump:heap:none -Xdump:java+system:events=systhrow,filter=java/lang/OutOfMemoryError,range=1..4,request=exclusive+compact+prepwalk

      当 OutOfMemoryError 发生时,这个命令生成一个 IBM 系统转储(和一个线程转储)而不是可移植堆转储。应该为所有生产 WebSphere Application Server 部署设置下面的 -Xdump 命令行选项:

      -Xdump:heap:none -Xdump:java+system:events=systhrow,filter=java/lang/OutOfMemoryError,range=1..4,request=exclusive+compact+prepwalk

IBM 转储的后处理要求

IBM 系统转储必须通过 JDK 附带的 jextract 工具进行后处理:

WebSphere_Application_Server_Install_Path/java/jre/bin/jextract core

理想情况下,jextract 在生成转储的物理机器上运行,从生成转储的 JDK 安装使用,并能对 Java 进程运行使用的库进行读访问。鉴于 jextract 在处理转储时可能会消耗大量 CPU 周期,理想情况在一些生产系统中可能难以接受。在生产系统中,转储应该在最匹配的机器上处理,比如预生产测试系统。Java 运行时的服务刷新(SR)版本和补丁(FP)版本应该适合。

jextract 工具生成一个 ZIP 文件,其中包含原始核心转储、一个经过处理的转储表示、Java 可执行文件、以及 Java 进程使用的库。您可以删除原始核心转储,因为它存在于这个 ZIP 文件中。这个 ZIP 文件应该加载到 Memory Analyzer 工具中。

在 WebSphere Application Server 管理控制台中设置 Java 命令行选项

可以使用进程定义的 Java Virtual Machine 面板中的 泛型 JVM 参数选项 设置 Java 命令行选项。要找到 Java Virtual Machine 面板:

  1. 导航到管理控制台并选择左侧面板中的 Servers > Server Types > WebSphere application servers
  2. 从主面板选择您的应用程序服务器(见图 1)。
    图 1. 选择应用程序服务器
    图 1. 选择应用程序服务器
    图 1. 选择应用程序服务器
  3. 展开主面板右侧的 Java and Process Management 选项并选择 Process definition(见图 2)。
    图 2. 选择 Process definition
    图 2. 选择 Process definition
    图 2. 选择 Process definition
  4. 选择右侧的 Java Virtual Machine 选项(见图 3)。
    图 3. 选择 Java Virtual Machine
    图 3. 选择 Java Virtual Machine
    图 3. 选择 Java Virtual Machine
  5. 主面板底部显示 Generic JVM arguments 文本框。

添加选项后,需要保存并同步更改,然后重启应用程序服务器使更改生效。

安装 Memory Analyzer 和 IBM Extensions

Memory Analyzer 被安装到 IBM Support Assistant 中。可以使用 IBM Support Assistant 或 Eclipse Memory Analyzer Tool (MAT) 中的更新程序功能安装 IBM Extensions for Memory Analyzer(以下简称 IBM Extensions)。请参阅 IBM Monitoring and Diagnostic Tools for Java - Memory AnalyzerIBM Support Assistant 和开源 Eclipse Memory Analyzer Tool 的文档了解这些工具的安装说明。一般安装步骤总结如下:

  1. 安装然后打开 IBM Support Assistant。
  2. 选择 Update > Find New... > Tools Add-ons
  3. 展开 JVM-based Tools 部分。
  4. 选择插件 IBM Monitoring and Diagnostic Tools for Java – Memory Analyzer [Tech Preview]
  5. 安装 Memory Analyzer 之后,重启 IBM Support Assistant。
  6. 要启动 Memory Analyzer,单击 Analyze Problem,然后单击 IBM Monitoring and Diagnostic Tools for Java - Memory Analyzer [Tech Preview],最后单击 Launch 按钮。

IBM Extensions 是一个插件集,同时适用于 IBM Support Assistant 中的 Memory Analyzer 工具和 Eclipse MAT。这些扩展中包含一般 Java 应用程序和特定 IBM 软件产品的知识,以向那些产品提供额外的调试功能。IBM Extensions 目前提供以下产品的扩展:

  • Java SE 运行时
  • WebSphere Application Server
  • IBM WebSphere eXtreme Scale
  • IBM CICS® Transaction Gateway

下面的步骤总结了如何将 IBM Extensions 安装到 IBM Support Assistant 中;针对 MAT 的安装流程非常相似:

  1. 从 IBM Support Assistant 菜单,选择 File > Preferences
  2. 选择 Updater Preferences
  3. 选中 Automatically include this location when searching for new or updated plug-ins
  4. 选择 Use this specified update site in addition to the IBM Support Assistant update site
  5. 从下拉列表框选择 http,输入地址:http://dl.alphaworks.ibm.com/ettktechnologies/updates
  6. 现在,您已经允许 IBM Support Assistant 在搜索新工具和更新时搜索 IBM Extensions for Memory Analyzer 升级站点。要请求 IBM Support Assistant 搜索新工具,从 IBM Support Assistant 中的菜单选择 Update > Find New... > Tools Add-ons
  7. 展开 JVM-based Tools 部分。
  8. 选择名称前面部分为 “IBM Extensions for Memory Analyzer - ” 的插件。IBM Extensions for Memory Analyzer - Utilities (required) 插件必须安装。其他插件都是可选的,具体取决于您想要哪个产品的插件。
  9. 接受许可条款并单击 Finish
  10. 重新启动 IBM Support Assistant 工作台后,新插件应该已安装好,可以在 Memory Analyzer 中使用。

在 Memory Analyzer 中使用 IBM Extensions

“总是启动” 的扩展

有些 IBM 扩展 “总是启动”,即各种视图显示关于一个与其地址相邻的对象的额外信息。例如,在图 4 显示的用例中,选中的对象现在描述 MemoryStore 中有多少会话,以及那些会话针对哪些 web 应用程序。IBM Extensions 添加会话的数量和应用程序名称,以便立即描述内存使用的起源。

图 4. Memory Analyzer 的 Overview 选项卡显示一个大对象
图 4. Memory Analyzer 的 Overview 选项卡显示一个大对象
图 4. Memory Analyzer 的 Overview 选项卡显示一个大对象

在 Dominator 树视图(共同保留整个 Java 堆的一列对象),类加载器分组使用它加载的类的描述替代类加载器的名称。例如,图 5 中选中的类加载器显示它是 PlantsByWebSphere web 应用程序的类加载器。

图 5. 按照 IBM 产品扩展的类加载器分组的 Dominator Tree
图 5. 按照 IBM 产品扩展的类加载器分组的 Dominator Tree
图 5. 按照 IBM 产品扩展的类加载器分组的 Dominator Tree

下拉菜单扩展

有几个 IBM 扩展是可执行查询,可以在 Query Browser 下拉菜单中找到。IBM Extensions 位于 IBM Extensions 类别下,细分为 3 个子类别:Java SE Runtime、CICS Transaction Gateway 和 WebSphere Application Server(见图 6)。

图 6. Open Query Browser Button 展开一个通往 IBM 产品扩展查询的上下文菜单
图 6. Open Query Browser Button 展开一个通往 IBM 产品扩展查询的上下文菜单
图 6. Open Query Browser Button 展开一个通往 IBM 产品扩展查询的上下文菜单

目前可用以下查询:

  • Java SE 运行时
    • Java Overview 提供一个 Java 运行时和流程摘要,包括供应商、版本、操作系统、Java 主目录、类路径和命令行。
    • DirectByteBuffers 生成两个报告:一个摘要,包含 DirectByteBuffer 实例的数量、它们的关联内存以及它们的服务对象;一个表,包含每个单独的 DirectByteBuffer 实例。
    • List All Objects 生成堆上的每个 Java 对象的列表,最初按照各个对象的大小排序。
    • List All GC Roots 生成所有垃圾收集根的列表,并列示从 Java 堆外部(比如线程或 JNI 代码等区域)引用的对象,这些对象充当垃圾收集确定哪些 Java 对象仍然被 Java 应用程序使用的出发点。
    • Export Object 支持将一个对象图作为文本表示写入一个文本文件。
    • Calculate Naive Retained Heap Size 计算一个指定对象保留(或引用)的所有对象,忽略其中有些对象可能还别应用程序的其他部分引用这个事实。
  • CICS Transaction Gateway
    • Overview 提供一个 CICS Transaction Gateway 基本概览,包括版本和构建信息、正在使用的配置、以及所有环境变量集的列表。
    • Active Conversations 提供 CICS Transaction Gateway 中的所有活动 IPIC 对话、它们当前拥有的会话及其状态。
    • Requests 提供 CICS Transaction Gateway 中已经处理或正在处理的 ECI 请求对象。
    • Statistics 提供 CICS Transaction Gateway 记录的统计数据的一个选择。
  • WebSphere Application Server
    • WAS Overview 提供一个 WebSphere Application Server 运行时摘要,包括产品和版本、服务器名称、节点、单元以及已部署应用程序的状态。
    • WAS Cache Analysis 提供应用程序服务器提供的缓存的摘要,显示它们的大小、占用率以及保留的内存。
    • Web Container Analysis 提供已部署 web 应用程序的细目、它们的地址、以及与它们关联的 HTTP 会话的数量。
    • Thread Pool Analysis 提供应用程序服务器提供的线程池的表,其中包括:线程池配置、挂起线程的存在性和当前大小;还提供一个 Java 级线程组表,包括线程计数和关联内存量。
    • HTTP Sessions 生成内存中的每个 HTTP 会话的列表,总结应用程序名称、会话 ID、用户名、超时、以及创建时间和最好访问时间。另外,可以扩展任何 HTTP 会话,查看与会话本身关联的键和值。
    • EJB Container 提供应用程序服务器中部署的每种 EJB 类型的数量的一个简单细目。
    • Application Class Loader Leaks 列示所有应用程序类加载器,表明它们是否被停止,因此导致泄漏。可以使用这个查询来确定哪个应用程序有问题。
    • Alarm Manager 提供可延迟、不可延迟、已延迟以及未排队的警报的列表。
  • WebSphere eXtreme Scale
    • Priority Queue Runnables 发现 APAR PM30264 中描述的问题。

扩展实际应用

WAS Overview 查询

WAS Overview 查询是一个简单查询,显示当前运行的 WebSphere Application Server 的版本和补丁级别,服务器、节点和单元名称,推断的进程启动时间,以及所有应用程序及其运行状态的列表(见图 7)。这个查询可以通过导航到 Open Query Browser > IBM Extensions > WebSphere Application Server > WAS Overview 来访问。

图 7. WebSphere Application Server Overview 查询
图 7. WebSphere Application Server Overview 查询
图 7. WebSphere Application Server Overview 查询

HTTP Sessions 查询

一类常见问题与应用程序的 HTTP 会话使用相关。除 OutOfMemoryErrors 外,其他问题包括发现会话内容、超时值、会话标识符以及会话所属的应用程序。还有许多实现细节使得发现会话及其值并不容易。这些细节包括不同的产品版本的类名不同,一个会话有两个映射(一个映射用于持久会话,另一个映射用于非持久会话,这两个映射可能在单个会话中同时保持活动状态)。

HTTP Sessions 查询将所有这些信息都提取到一个树视图中(见图 8)。这个查询可以通过 Open Query Browser > IBM Extensions > WebSphere Application Server > HTTP Sessions 访问。图 8 中加点的行下面的列是上面的列的继续。

图 8. WebSphere Application Server HTTP Sessions 查询
图 8. WebSphere Application Server HTTP Sessions 查询
图 8. WebSphere Application Server HTTP Sessions 查询

每个会话对象都可以扩展,显示其 “键/值” 对。在图 9 中,会话中有 5 个属性。每个键都采用 sessN 形式,值是一个自定义对象。如果值不是 String,则可以展开行显示对象。

图 9. 带有一个已展开会话及其属性的 WebSphere Application Server HTTP Sessions 查询
图 9. 带有一个已展开会话及其属性的 WebSphere Application Server HTTP Sessions 查询
图 9. 带有一个已展开会话及其属性的 WebSphere Application Server HTTP Sessions 查询

这个插件还可用于 PHD 堆转储,但大多数元数据都会缺失,只显示属性的保留堆大小。

Application Class Loader Leaks 查询

当应用程序重启但它们的类加载器没有清理时,将发生应用程序类加载器泄露。这种情况通常由一个应用程序引用引起,该引用从服务器中的其他地方(比如 ThreadLocals)引用应用程序。如果存在应用程序类加载泄露且应用程序重启次数达到一定数量,就可能会导致 Java 或原生 OutOfMemoryErrors。

Application ClassLoader Leaks 查询将找到所有停止的应用程序类加载器,询问可能导致类加载器不适合垃圾收集的可疑对象。这个插件处理 PHD 堆转储的效果同样好(见图 10)。可以通过 Open Query Browser > IBM Extensions > WebSphere Application Server > Application ClassLoader Leaks 访问此插件。

图 19. WebSphere Application Server Application ClassLoader Leaks 查询
图 19. WebSphere Application Server Application ClassLoader Leaks 查询
图 19. WebSphere Application Server Application ClassLoader Leaks 查询

结束语

Memory Analyzer 和 IBM Extensions for Memory Analyzer 允许您深入洞察 WebSphere Application Server 及其相关产品的内部运行情况。我们建议您尝试本文介绍的技术和插件,特别是对 IBM 运行时使用系统转储而非 PHD 转储。参与 alphaWorks 论坛,告知我们您希望通过系统转储了解什么其他信息。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=659767
ArticleTitle=权威支持: Memory Analyzer(及其 IBM Extensions 插件)为何不再只用于内存泄露
publish-date=05192011