利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(2)

启动和理解 MDD4J[size=1.0625]为了充分理解如何使用 MDD4J,您需要了解用于描述内存泄漏的几个术语的含义。图 1 通过名为 MyClass 的示例展示了这些术语,此示例具有一个 HashSet,包含字符串对象。
图 1. 内存泄漏术语利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题-LMLPHP

  • 泄漏根:包含导致泄漏容器的对象链的引用的对象。如果在所有者链中未发现任何类对象,则此术语表示可找到泄漏容器的内存转储中的根对象。
  • 泄漏容器:唯一拥有所有泄漏对象的对象。在本例中是 HashMap。
  • 泄漏单元:存在多个实例的数据结构内的对象。在本例中是 HashMap 内的 HashMap$Entry 对象。
  • 所有者链:从泄漏根对象开始到泄漏容器对象的对象链。
  • 内容:泄漏根下为堆消耗的大部分负责的实际数据。

[size=1.0625]另外还有一些未在图 1 中出现的信息,但与内存泄漏相关:

  • 区域大小:给定对象可接触的所有对象的总大小。在本例中,就是影响泄露根的区域大小的所有对象。
  • 区域大小落差:一个对象的区域大小和该对象的子对象的区域大小之间的差别。此差别与实例计数的差别是发现泄漏疑点的关键。

[size=1.0625]MDD4J 的启动与 IBM Support Assistant workbench 中安装的其他工具相同。图 2 显示了 workbench 中的 MDD4J 在启动并完成分析后的状态。在分析完成后,您看到的第一个视图就是 Analysis Summary。(如果希望将 MDD4J 从 workbench 导出到其他机器上,将有一个批处理文件或 shell 脚本可用于运行此工具)。
[size=1.0625]在下面的几节中,您将了解分析结果在 MDD4J 中的显示方式。所显示的信息针对主转储。
评估分析结果[size=1.0625]Analysis Summary 是您在分析完成后看到的第一个视图。它显示了分析结果的信息汇总,并提供了堆内容和堆中主要组成部分的快速概览。在这个窗格中,可以确定在堆大小中占最大比例的组件和类型。
图 2. IBM Support Assistant workbench 中的 MDD4J利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题-LMLPHP[size=1.0625]Analysis Summary 具有三个部分:

  • Basic Heap Information(如图 3 所示)显示关于堆和堆转储文件的信息:堆大小、对象数量、对象类型数量、堆转储文件名称和堆转储文件的获取日期。图 3. Basic Heap Information利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题-LMLPHP
  • High-level Summary of the Heap Contents(如图 4 所示)显示了两个图表,显示在堆大小中占比例最大的堆转储中的组件和类型。
    • Predefined Components 图显示了与 Java 和 WebSphere 应用程序中的常用组件相比,各组对象在堆大小中所占的相对比例。
    • Type Breakdown 图显示了最常用的 Java 类在堆大小中所占的相对比例。

    图 4. High-level Summary of the Heap Contents利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题-LMLPHP

[size=1.0625]在 Analysis Summary 视图中,还可访问单一文件的 HTML 报告(如图 2 所示),其中提供了分析结果的汇总。报告包含 MDD4J 中各种视图提供的所有信息,但未显示图形。可利用此报告与您的同事快速共享分析结果。
[size=1.0625]还可以下载一部分 MDD4J 用户界面(Data Structures[size=1.0625] 选项卡,本文稍后将加以介绍),将其作为 Yeti Report[size=1.0625] 独立报告(如图 2 所示),并保存所得到的 .zip 压缩文件。将压缩文件的内容解压到空目录中,在 Web 浏览器中打开 index.html 文件。关于 Yeti,请参见 认识大型堆。

05-08 08:24