如何在Java中查看堆中的内容?

时间:2008-09-28 14:15:21

标签: java out-of-memory

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

我可以使用哪些工具来检查我的java应用程序的堆,以查看我的所有堆中的内容是什么,以便我可以找出保留对应该能够被垃圾收集的对象的引用。

8 个答案:

答案 0 :(得分:24)

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-one-click/

答案 1 :(得分:6)

如果您需要免费的内容,请尝试VisualVM

从项目的描述:

  

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

使用JProfilerYourKitProfiler

等分析器

答案 4 :(得分:1)

答案 5 :(得分:1)

使用Eclipse Memory Analyzer

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

该工具可以免费用于开发,您可以下载它here