好吧,这很尴尬......
我开始使用 Eclipse 内存分析器来查找 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 上)。
Matt B 使用 jvisualvm 的建议很好地解决了我的问题,它为我指出了一个更有用的旧 jconsole 替代品。它有一个很好的内存分析器,可以显示哪些类型的对象数量最多并且拥有最多的内存。它有一个监视器,可以显示一段时间内的实际内存使用情况。当您要求它进行堆转储时,它甚至会告诉您文件名!Eclipse Memory Analyzer 为您提供完整的详细信息。