首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

区域大小泄漏疑点此视图是识别内存泄漏的起点。分析几乎总是会发现某些疑点,但并非全部疑点都是真正的内存泄漏。泄漏疑点按区域大小排序,最重要的泄漏疑点显示在最顶端。
在分析内存不足的情况时,这是信息的主要来源。如果存在内存消耗过度的现象,此视图可提供有用的信息。而 Data Structures 视图可以提供更多细节。
此外有两个子视图,均显示泄漏疑点,但针对不同级别(如图 5 和图 6 所示)。在大多数情况下,顶级泄漏疑点在两个视图中是相同的——但若顶级泄露疑点不同,就有必要审查两个视图中的疑点:
  • 聚合数据结构级别(如图 5 所示)针对相同所有者链内相同类型的实例汇总。泄漏疑点组织为表,每个表表示一个泄漏根。泄漏根的名称列于表上方,显示为一个超链接,链接到内容示意图。内容示意图就是泄漏根下所有者链的图形表示。
  • 对象/类级别(如图 6 所示)针对堆的原始参照图中的时机实例。在大多数情况下,所显示的信息应与聚合数据结构级别视图相同。
聚合数据结构泄漏疑点有多个表表示泄漏根下参考树中发现的疑点,每个表针对一个泄漏根。泄漏根列在表上方(如图 5 所示),是链接的形式,链接到泄漏根所有者链的图形表示,这也称为内容示意图。这个图形表示可帮助您了解表中所示的泄漏根、泄漏容器和泄漏单元之间的关系。此表显示了一对泄漏容器和泄漏单元,带有泄漏单元的实例数量及其总大小。
例如,图 5 显示,EvaluateServlet 类的一个实例是泄漏容器,ArrayList 类的一个实例是第一行的泄漏类型。通常,您会看到表的一行中的泄漏单元是同一个表中另一行内的泄漏容器。这也就是说,存在嵌套的容器类型。
例如,图 5 中的第 3 行列举了 HashMapi 实例包含的 Analyzer 类的一个实例,第四行显示同一个 HashMap 包含 1000 个 Analyzer$Chunk 类实例。
图 5. 聚合数据级泄漏疑点应自上而下地阅读此表来解释信息(如图 5 所示)。在某些情况下,如本例中的iqngkuang,可能存在多个不同的泄漏。下方的每个数字都对应于表中的相应行。
  • 包含 ArrayList 的一个实例(大小为 78MB)的 EvaluateServlet 实例。
  • 此 ArrayList 包含 Analyzer 的一个实例。
  • 此 Analyzer 包含 Hashtable 的一个实例。
  • 此 Hashtable 包含 629 个 Chunk 实例,这是 Analyzer 的内部类。
  • 每个 Chunk 实例包含一个 ArrayList。
  • 1000 个 Chunk 实例中的所有 ArrayLists 包含 500,000 个 String 实例,总计大小为 76 MB。
  • 下一个 Chunk 实例包含 Hashtable 实例(大小为 49 MB)。
  • 此 Hashtable 包含 629 个 Chunk 实例。
  • 每个 Chunk 实例包含一个 ArrayList。
  • 1000 个 Chunk 实例中的所有 ArrayLists 包含 314,500 个 String 实例,总计大小为 48 MB。
对象/类泄漏疑点这个视图比聚合数据级泄漏疑点列表更加简单。对象/类泄漏疑点表(如图 6 所示)显示了泄漏根及其泄漏容器的列表,以及容器的总大小和所有泄漏单元的区域大小落差。如前所述,此列表应包含与聚合数据结构级别表(如图 5 所示)相同的顶级泄漏疑点。
图 6. 对象/类泄漏疑点图 6 显示了与聚合数据结构泄漏疑点视图(如图 5 所示)中的前两个泄漏疑点相同的一点。总大小的差别是由于聚合数据结构级别视图使用汇总实例计数,对象/类泄漏疑点视图使用实际事例和大小计数。
使用泄漏疑点视图为了阅读两个泄漏疑点视图中的信息,首先要从第一行开始阅读表格。由于识别漏洞极为复杂,因而应注意列表中的最后一个疑点,若其泄漏容器大小低于堆大小的 5-10%(如图 2 的 Analysis Summary 视图所示),则表示这根本不是泄漏。此类微不足道的泄漏应予以忽略。
顶级泄漏疑点十分重要,您应点击表上方的链接,查看其内容示意图。随后查看表中列举的泄漏疑点,识别哪些类只是容器,哪些类是泄漏类。为此,您需要了解为其生成堆转储的应用程序的结构或实现。请牢记,列为泄漏类的类本身可能并不是导致泄漏的原因。更有可能是其他用于创建类实例的代码导致了过度的内存占用。
识别出泄漏类后,您要检查 Data Structures 视图,确认泄漏根或泄漏单元占用了多少堆。如果 Data Structures 视图中未列出任一项内容,则泄漏并非真正的泄漏,此时应审查 Data Structures 视图中提供的占用堆比例最大的因素。(Data Structures 视图将在稍后详细介绍)。
对象表 Object Tables 视图包含两个子视图,列举了堆中的所有类和各类的实例。利用 Object Tables 选项卡中的视图可获得更多信息,包括堆中指定对象和类的数量,或确认泄漏疑点的大小。
两个表中的数据均可按列排序,只需点击列标题即可。再次点击列即可切换排序的次序。图 7 显示了按实例数量降序排列的表。
图 7. 按实例数量排序的对象表
返回列表