简介
这一部分是 Java 内存转储诊断 (MDD4J) 故障排除工具的简介,这种工具可帮助您分析 Java 堆,从而诊断内存占用问题。MDD4J 的分析结果在报告中提供,此报告汇总了应用程序使用 Java 堆的情况。
共有三种适合使用 MDD4J 提供帮助的场景:
内存泄漏:如果应用程序出现 java.lang.OutOfMemoryError 异常,或者详细的垃圾收集数据显示内存消耗逐渐增加,那么 MDD4J 可以指出造成此类增加的数据结构以及这些数据结构内的组件。
过度的内存消耗:如果一个应用程序未能很好地伸缩,或者所占用的内存比实现其所需任务占用的必要内存多,MDD4J 可为您显示占用过多内存的数据结构的高级说明。MDD4J 报告可为您显示集合的实现和其他类型的数据建模是怎样造成过度内存消耗的。
回归测试:MDD4J 提供的各种分析和数据结构视图可在修订 bug、添加或删除新特性时,帮助您跟踪内存消耗的更改。
MDD4J 可通过 IBM Support Assistant 获得。由于内存堆分析要占用大量处理器和 I/O 资源,您还可以在 IBM Support Assistant 工作台之外运行它。在服务器类机器上执行内存堆分析——特别是 64 位机器,允许您处理无限大小的内存堆,并为您的工作站保留大量资源,使您能够执行其他任务。
MDD4J 设计目标是提供足够的信息,帮助您识别问题,而不产生信息过载的问题。它并未提供深入、低级的专家功能,即手动检查堆内的整个对象图。如需获得深入的堆转储分析,可以使用 IBM Monitoring and Diagnostic Tools for Java – Memory Analyzer。
什么是堆转储?
堆转储也称为堆快照,就是内存中对象之间的参照转储,以及关于这些对象的信息。堆转储不包含变量名、值或源代码等信息。
在执行堆分析之前,需要一个堆转储。有三种方法可生成堆转储:
自动:JVM 通常会在用尽内容和崩溃时生成堆转储。
手动:可以向 JVM 发送一个信号,要求 JVM 生成堆转储。(MDD4J 文档具有关于如何在各种平台上生成堆转储的信息)。
编程:IBM SDK for Java 包含一个 com.ibm.jvm.Dump 类。使用其静态方法可以在您的应用程序运行的过程中生成堆转储。
如何分析堆转储
MDD4J 为堆转储文件使用不同的术语,以其获得的时间为依据:
基准堆转储
尽管 JVM 在崩溃时生成堆转储,但您可以将其与在应用程序启动后获取的堆转储相比较,进一步了解内存是如何使用的。这个在应用程序生命周期的早期获取的堆转储称为基准堆转储,可在执行比较分析时使用。