使用jconsole时Java转储堆文件的位置?

时间:2010-04-28 00:59:18

标签: java eclipse jconsole heap-dump

这是令人尴尬的......

我开始使用Eclipse Memory Analyzer来查找Windows机器上的Java内存泄漏。第1步是获取堆转储文件。为此,我从Eclipse中启动Java(javaw.exe)进程并使用jconsole连接到它。然后在jconsole MBeans选项卡上单击dumpHeap按钮。我第一次这样做时,我看到一个弹出窗口说它创建了堆转储文件,但没有给出它的名称或位置。现在每当我连接到不同的javaw.exe进程时再次执行dumpHeap时,jconsole会说:

Problem invoking dumpHeap : java.io.IOException: File exists

当然不会给出它的名字或路径。它可能在哪里?

我搜索了我的C:驱动器(使用cygwin命令行工具)来查找包含“hprof”或“java_pid”或“heapdump”的文件,并且没有找到任何合理的信息。我甚至使用Windows搜索来查找我的Eclipse工作区中最后一天发生了变化的所有文件。

我正在使用Sun Java 1.6 JVM,并且没有设置-XX:HeapDumpPath。

更新(2010年4月28日):我的原始堆文件位置必须由jconsole确定,我从该工具触发了堆转储。 JVM的堆转储位置必须仅适用于它触发的堆转储(例如,在OutOfMemoryException上)。

马特B建议使用jvisualvm很好地解决了我的问题,指出我对旧的jconsole更有用的替代品。它有一个很好的内存分析器,可以显示哪些类型的对象数量最多并且占用的内存最多。它有一个监视器,显示实际内存使用情况。当你要求它进行堆转储时,它甚至会告诉你文件名! Eclipse Memory Analyzer为您提供完整的详细信息。

5 个答案:

答案 0 :(得分:8)

尝试jvisualvm,它有一个更好的界面。

请注意,从JDK版本6更新7或更高版本开始,Java VisualVM与JDK捆绑在一起。请参阅here

答案 1 :(得分:6)

当您尝试从jconsole调用dumpHeap()时,为什么不设置dumpHeap(String,boolean)的第一个参数?它是生成的heapdump文件的位置和文件名。

答案 2 :(得分:4)

根据Sun Java SE6 JVM的docs

  

默认情况下,会在中创建堆转储   一个名为java_pid< pid > .hprof的文件   VM的工作目录

在Eclipse中,工作目录在“运行配置”对话框的“参数”选项卡上定义。默认值与您正在运行的类目录相同。

答案 3 :(得分:2)

您可以随时使用ProcessMonitor查看它要写入的位置:)过去自己完成此操作。

答案 4 :(得分:0)

我发现转储的文件放在启动我的java应用程序的.bat文件的同一个文件夹中。 (我使用的是Windows 8.1,java 7) 在我的情况下jboss,/ jboss-as / bin /文件夹。 为了找到它,我搜索了*文件,今天创建日期超过200MB。