题
我设法在我正在开发的java应用程序中获得内存“泄漏”。运行我的JUnit测试套件时,我会随机出现内存异常(java.lang.OutOfMemoryError)。
我可以使用哪些工具来检查我的java应用程序的堆,以查看我的所有堆中的内容是什么,以便我可以找出保留对应该能够被垃圾收集的对象的引用。
解决方案
VisualVM包含在最新版本的Java中。您可以使用它来创建堆转储,并查看其中的对象。
或者,您也可以使用jmap(在jdk / bin目录中)创建一个heapdump命令:
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-一键/
其他提示
这是一个非常古老的问题。很多人可能已经开始使用IntelliJ,因为它最初的答案。 IntelliJ有一个可以显示内存使用情况的插件,名为 JVM调试器内存视图。
使用 JProfiler 或 YourKitProfiler
JProfiler对我来说非常好......
http://www.ej-technologies.com/products/jprofiler /overview.html
在分析堆转储时,没有其他工具可以让我知道任何接近它的功能,性能和价格(免费和开源)的工具。
如果您使用的是支持GTK的系统,可以尝试使用 JMP 。