18

我已经设法在我正在开发的 java 应用程序中获得内存“泄漏”。运行我的 JUnit 测试套件时,我随机出现内存不足异常 (java.lang.OutOfMemoryError)。

我可以使用什么工具来检查我的 java 应用程序的堆,以查看我的所有堆都用完了什么,这样我就可以弄清楚是什么保留了对应该能够被垃圾收集的对象的引用。

4

8 回答 8

26

VisualVM 包含在最新版本的 Java 中。您可以使用它来创建堆转储,并查看其中的对象。

或者,您也可以使用 jmap(在您的 jdk/bin 目录中)创建 heapdump commandine:

jmap -dump:format=b,file=heap.bin <pid>

您甚至可以使用它来获取所有对象的快速直方图

jmap -histo <pid>

我可以推荐 Eclipse Memory Analyzer ( http://eclipse.org/mat ) 来进行堆转储的高级分析。它可以让您准确找出某个对象或一组对象存在的原因。这是一个博客条目,向您展示 Memory Analyzer 可以做什么: http: //dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-点击/

于 2008-09-28T14:30:28.827 回答
7

如果你需要一些免费的东西,试试VisualVM

从项目的描述:

VisualVM 是一个集成了命令行 JDK 工具和轻量级分析功能的可视化工具。专为开发和生产时间使用而设计。

于 2008-09-28T14:22:00.267 回答
3

这是一个相当古老的问题。自从最初回答以来,很多人可能已经开始使用 IntelliJ。IntelliJ 有一个可以显示内存使用情况的插件,称为JVM Debugger Memory View

于 2017-01-05T21:08:53.423 回答
2

使用Eclipse 内存分析器

在分析堆转储时,我不知道有任何其他工具可以接近它的功能、性能和价格(免费和开源)。

于 2008-10-08T08:14:39.310 回答
1

使用像JProfilerYourKitProfiler这样的分析器

于 2008-09-28T14:17:51.413 回答
1

JProfiler 对我来说工作得很好....

http://www.ej-technologies.com/products/jprofiler/overview.html

于 2008-09-28T14:18:51.023 回答
0

如果您使用的是支持 GTK 的系统,您可以尝试使用JMP

于 2008-09-28T14:16:33.070 回答
0

您可以尝试使用 JRockit Mission Control 工具套件中的 Memory Leak Detector。它允许您在 JVM 运行时检查堆。您不需要一直拍摄快照。您可以在线连接到 JVM,然后查看堆在垃圾收集之间的变化。您还可以检查对象、以图形方式跟踪引用并从应用程序当前分配对象的位置获取堆栈跟踪。下面是一个简单的介绍

该工具可免费用于开发,您可以在此处下载。

于 2008-09-29T23:34:56.230 回答