Board logo

标题: 利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(3) [打印本页]

作者: look_w    时间: 2018-8-13 21:51     标题: 利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(3)

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




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0