利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(1)
- UID
- 1066743
|
利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(1)
简介这一部分是 Java 内存转储诊断 (MDD4J) 故障排除工具的简介,这种工具可帮助您分析 Java 堆,从而诊断内存占用问题。MDD4J 的分析结果在报告中提供,此报告汇总了应用程序使用 Java 堆的情况。
共有三种适合使用 MDD4J 提供帮助的场景:
- 内存泄漏:如果应用程序出现 java.lang.OutOfMemoryError 异常,或者详细的垃圾收集数据显示内存消耗逐渐增加,那么 MDD4J 可以指出造成此类增加的数据结构以及这些数据结构内的组件。
- 过度的内存消耗:如果一个应用程序未能很好地伸缩,或者所占用的内存比实现其所需任务占用的必要内存多,MDD4J 可为您显示占用过多内存的数据结构的高级说明。MDD4J 报告可为您显示集合的实现和其他类型的数据建模是怎样造成过度内存消耗的。
- 回归测试:MDD4J 提供的各种分析和数据结构视图可在修订 bug、添加或删除新特性时,帮助您跟踪内存消耗的更改。
MDD4J 可通过 获得。由于内存堆分析要占用大量处理器和 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 在崩溃时生成堆转储,但您可以将其与在应用程序启动后获取的堆转储相比较,进一步了解内存是如何使用的。这个在应用程序生命周期的早期获取的堆转储称为基准堆转储,可在执行比较分析时使用。
- 主堆转储主堆转储是在问题发生时获取的转储,如用尽内存,或过度的堆占用。此堆转储可在 JVM 用尽内存或崩溃时自动生成。也可通过编程或向 JVM 发送信号来手动生成。可以在主堆转储上执行单一或对比性堆转储分析。
MDD4J 允许执行两种不同类型的堆转储分析,具体取决于可用的堆转储数量:
- 如其名称所示,单一堆转储分析是对一个堆转储执行的,也就是主堆转储。它为您展示关于堆的所有信息,包括可能造成泄漏的和重要的数据结构。
- 比较性堆转储分析使用两个堆转储,也就是基准和主堆转储,并比较其差异。
在分析过程中,MDD4J 尝试找到可能性最高的泄漏疑点。之所以称为疑点,是因为没有方法能够准确识别过高的堆占用的原因。分析识别出泄漏疑点,并不表示确实存在泄漏。对于缓存实现来说,这一点尤为明显,因为那与典型的内存泄漏极为相似。 |
|
|
|
|
|