5

好吧,这很尴尬......

我开始使用 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 为您提供完整的详细信息。

4

5 回答 5

8

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

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

于 2010-04-28T17:40:32.393 回答
6

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

于 2010-07-07T03:16:00.907 回答
4

根据Sun Java SE6 JVM的文档:

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

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

于 2010-04-28T01:42:17.843 回答
2

您总是可以使用ProcessMonitor查看它试图写入的位置:) 过去我自己做过。

于 2010-04-28T01:01:22.830 回答
0

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

于 2015-01-13T15:04:02.800 回答