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

Jim*_*ans 4 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

mat*_*t b 8

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

请注意,从JDK版本6更新7或更高版本开始,Java VisualVM与JDK捆绑在一起.看到这里.


Jas*_*ins 6

根据Sun Java SE6 JVM 的文档:

默认情况下,堆转储是在虚拟机工作目录中名为 java_pid< pid >.hprof 的文件中创建的

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


小智 6

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