分析和了解应用程序的内存使用情况是一项具有挑战性的操作。细微的 logic 错误可能导致侦听器永远不会被处理,最终导致可怕的 OutOfMemory 错误。即使您的应用程序正确处理了所有未使用的对象,它仍可能需要比所需多 10 倍或 100 倍的内存。
幸运的是,Eclipse Memory Analyzer (MAT) 可以帮助提供应用程序内存使用情况的详细信息。该工具可用于跟踪内存泄漏和定期查看系统状态。在本教程中,我将概述 10 个技巧来帮助您更有效地使用 MAT。如果您是 Java 开发人员,Eclipse Memory Analyzer Tool 当然应该在您的调试工具箱中。
在这个例子中,我们使用的是一个非常简单的程序,它分配了 100,000 个 Listener,并将它们存储在 4 个不同的列表中。然后,应用程序将休眠,而不删除或清除这些列表。
1、获取内存快照(Heap Dump)
您可以通过多种方式开始使用 MAT
● 将应用程序配置为在发生内存不足错误时转储其内存内容,
● 将 MAT 连接到现有的 java 进程,或者
● 手动获取堆转储并将其加载到 MAT 中
在所有情况下,请务必记住,这是某个时间点的内存快照。MAT 无法告诉您创建对象的原因,也无法显示已经被垃圾回收的对象。但是,如果将 MAT 与其他调试工具和技术一起使用,则通常可以很快克服内存泄漏。
要将应用程序配置为在引发 OutOfMemory 错误时生成堆转储,请添加以下 vm 参数:
或者,您可以使用 jstack 从当前正在运行的 java 进程中获取 Heap dump。
最后,您可以使用 MAT 的 Acquire Heap Dump 操作来选择本地计算机上的现有 Java 进程。
首次加载 Heap dump 时,MAT 将对其进行索引。这需要几分钟时间,但结果将保留下来,因此后续加载会很