2008-09-28 22 views
15

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

我可以使用什么工具来检查我的Java应用程序的堆以查看堆中所有堆的使用情况,以便我可以计算出应该能够进行垃圾回收的对象的引用。

回答

23

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

另外,您还可以创建使用JMAP堆转储commandine(在你的JDK/bin目录):

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

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

jmap -histo <pid> 

我可以推荐Eclipse内存分析器(http://eclipse.org/mat)进行堆转储的高级分析。它可以让你准确找出为什么某个对象或某组对象是活着的。下面是一个博客条目,向您展示内存分析器可以执行的操作:http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/

+0

Visual VM和Netbeans Profiler允许您执行与EMA相同的操作。 – 2008-09-29 19:11:29

+1

我不知道netbeans,但我当然没有在visual vm中找到'gc root'的最短路径。 – Tom 2008-09-29 19:31:40

0

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

6

如果你需要一些免费的,尽量VisualVM

从项目的描述:

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

0

您可以尝试属于JRockit Mission Control工具套件的内存泄漏检测器。它允许您在JVM运行时检查堆。您不需要一直拍摄快照。您可以在线连接到JVM,然后查看垃圾收集之间的堆如何变化。您还可以检查对象,以图形方式跟踪引用,并从应用程序当前分配对象的位置获取堆栈跟踪。这是一个简短的introduction

该工具是免费使用的开发,你可以下载它here

1

使用Eclipse Memory Analyzer

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

2

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