利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(2)
启动和理解 MDD4J[size=1.0625]为了充分理解如何使用 MDD4J,您需要了解用于描述内存泄漏的几个术语的含义。图 1 通过名为 MyClass 的示例展示了这些术语,此示例具有一个 HashSet,包含字符串对象。 图 1. 内存泄漏术语- 泄漏根:包含导致泄漏容器的对象链的引用的对象。如果在所有者链中未发现任何类对象,则此术语表示可找到泄漏容器的内存转储中的根对象。
- 泄漏容器:唯一拥有所有泄漏对象的对象。在本例中是 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[size=1.0625]Analysis Summary 具有三个部分: [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,请参见 认识大型堆。 |