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

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

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

探究数据结构您看到的第一个视图就是显示堆中成本最高的数据结构的柱形图。前接 “statics” 的名称表示在给定类静态字段根下的数据结构。紧接其后的指令说明如何探索数据结构,适用于所有选项卡中显示的数据结构。
在每个柱形的右侧(如图 17 所示)给出了数据结构的大小(有时会给出两个大小),柱形的长度就是通过该数据结构可获得的字节总数。通常,数据结构有重叠,一个数据结构的内容同时也是另一个数据结构的一部分。若出现此类共享,您将看到两个数字,第二个数字位于括号中。
图 17. 数据结构大小共享显示通过其他数据结构可获得该数据结构的大小比例。换句话说,显示了与其他数据结构共享的数据结构。可以选择一个数据结构,更详细地查看其内容。若点击数据结构柱形图中的任意柱形,窗口右侧就会更新为显示选定结构内容的基本汇总。图 18 展示了在点击图 17 中所示的 EvaluateServlet 柱形时显示的汇总信息。
图 18. EvaluateServlet 汇总如果不存在共享,选择列表就只有单独一个项目,表示整个数据结构。在与其他数据结构共享一个数据结构的各部分时,选择列表将包含多个项目,每个项目针对一个共享部分。每部分都是一个子数据结构,所有对象都是该部分的唯一部分。在部分列表中,您将看到构成此结构同时又作为其他结构的组成部分的部分(末尾处标有 “shared”)与仅是此结构的组成部分的部分(无前述后缀)之间的差别.
探索内容示意图为进一步了解一个部分的内部结构,点击数据结构类型的标有下划线的名称,或点击数据结构连接,选择集合类型(如图 19 所示)。您将看到一个弹出窗口,显示了选定部分的内容示意图(如图 20 所示)。
图 19. 选择数据结构类型内容示意图显示了构成数据结构的具体内容。。它显示了数据结构如何利用集合(如 HashMap 或 Vector)来设定数据结构的元素的结构。图 20 和图 21 都是内容示意图的例子。应按照阅读 UML 或实体关系(ER)图的方式阅读示意图,每个节点都表示一个集合基础设施(例如,标准库实现 HashMap 的方式)或者目标程序包含的实体(例如,映射中的 String 键)。在两种情况下,对于集合和内含实体来说,内容示意图都隐藏了实现细节,所显示的唯一数字就是该实体实现细节的总体大小。
图 20. EvaluateServlet 内容示意图图 20 显示了 EvaluateServlet 内容示意图。某些节点并未显示类名,这是由于这些实例对根类实例的大小无显著影响。此内容示意图显示了 500,000 个 String 实例的分配方式。
图 21 显示了更为复杂的内容示意图示例。
图 21. 复杂的内容示意图类型图
如果内容示意图中的一个节点看起来过大,您可向下访问到显示该实体实现细节的视图。为此,双击内容示意图中的任意节点,您将看到另外一个弹出窗口,显示选定实体的类型图。图 22 显示了 EvaluateServlet(如图 20 所示)下的所有链引用的 Hashtable 的类型图。类型图显示一个实体的类(数据类型)相互连接的方式,显示每种类型对该实体在选定数据结构的内容示意图中所占大小的影响。
图 22. Hashtable 类型图字段布局视图
如果类型图中的一个节点看起来过大,您可双击它,向下访问到字段布局视图(如图 23 所示)。对于支持此数据的堆快照(目前仅有 HPROF),此视图将显示选定类的字段以及该类的继承层次结构对于其实例大小的影响。通常,开发人员会为类添加很多字段,而未意识到为类所添加的每个整型字段都会在运行时与一个较大的因数(实例数量)相乘。例如,开发人员往往会为缓存计算添加字段,或在构建阶段仅添加必要的字段,而在应用程序的长期使用过程中,这些都不是必要的。
图 23. 字段布局视图
返回列表