我正在开发一款Java应用程序,出现了内存泄漏的情况。在运行JUnit测试套件时,经常会随机抛出内存不足异常(java.lang.OutOfMemoryError)。
有哪些工具可以用来检查我的Java应用程序的堆,以查看是什么占用了所有的堆空间,从而找出是什么导致对象无法被垃圾回收。
我正在开发一款Java应用程序,出现了内存泄漏的情况。在运行JUnit测试套件时,经常会随机抛出内存不足异常(java.lang.OutOfMemoryError)。
有哪些工具可以用来检查我的Java应用程序的堆,以查看是什么占用了所有的堆空间,从而找出是什么导致对象无法被垃圾回收。
VisualVM已经包含在最新版本的Java中。您可以使用它来创建堆转储,并查看其中的对象。
另外,您也可以使用jmap(位于jdk/bin目录中)来创建一个命令行堆转储:
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-click/这是一个比较老的问题。很多人可能从原来的回答以后开始使用IntelliJ。 IntelliJ有一个插件可以显示内存使用情况,叫做JVM Debugger Memory View。