2010-04-28 50 views
4

嗯,这是令人尴尬的......使用jconsole时Java转储堆文件的位置?

我开始玩Eclipse Memory Analyzer来查找Windows盒子上的Java内存泄漏。第1步是获取堆转储文件。为此,我从Eclipse内启动我的Java(javaw.exe)进程,并使用jconsole连接到它。然后在jconsole MBeans选项卡上单击dumpHeap按钮。我第一次做到这一点时,看到一个弹出窗口说它创建了堆转储文件,但没有给出它的名称或位置。现在,每当我再次做了dumpHeap同时连接到不同的javaw.exe进程,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为您提供完整的详细信息。

+0

尝试jvisualvm,它有一个更好的接口 – 2010-04-28 01:07:51

+0

IDEs真的有用,直到他们不 – 2010-04-28 07:38:44

+0

@matt b:你是绝对正确的,它甚至告诉我文件名后堆转储! C:\ DOCUME〜1 \ ferrans \ LOCALS〜1 \ Temp \ visualvm.dat \ localhost-4180 \ heapdump-1272470561431.hprof添加这个答案,我会接受它。 – 2010-04-28 16:06:46

回答

8

尝试jvisualvm,它有一个更好的接口。

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

+0

谢谢,这解决了我的问题*和*教我新的东西,非常有用! – 2010-04-28 22:47:02

2

您总是可以使用ProcessMonitor来查看它试图写入的内容:)过去自己完成此操作。

+0

@Chris:有趣的建议,我会试一试! – 2010-04-28 02:55:00

4

按照docs用于在Sun Java SE6 JVM:

默认情况下,堆转储在 创建一个名为java_pid < PID在VM

的 工作目录> .hprof

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

+0

谢谢Jason,我会看看Run Configurations对话框。我无法为另一个进程创建第二个堆转储文件,这似乎与此命名方案相矛盾。 – 2010-04-28 02:54:21

+0

嗯,在进程的当前目录中没有hprof文件。由于jvisualvm在另一个目录中设置了heapdump文件名,我想jconsole也可以吗? – 2010-04-28 16:15:03

6

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

0

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