在“Out of Memory”之后找到堆转储的位置

时间:2010-03-09 13:50:51

标签: java memory heap dump

我正在使用ASANT来运行指向NARS.jar文件的xml文件。

我收到“java.lang.OutOfMemoryError:Java堆空间”,我正在研究这个问题。

所以我发现我需要设置“-XX:+ HeapDumpOnOutOfMemoryError”,以创建要分析的转储文件。

我编辑了ASANT.bat并将“-XX:+ HeapDumpOnOutOfMemoryError”添加到ANT_OPTS:

set ANT_OPTS= "-XX:+HeapDumpOnOutOfMemoryError" "-Dos.name=Windows_NT" "-Djava.library.path=%AS_INSTALL%\lib;%AS_ICU_LIB%;%AS_NSS%" "-Dcom.sun.aas.installRoot=%AS_INSTALL%" "-Dcom.sun.aas.instanceRoot=%AS_INSTALL%" "-Dcom.sun.aas.instanceName=server" "-Dcom.sun.aas.configRoot=%AS_CONFIG%" "-Dcom.sun.aas.processLauncher=SE" "-Dderby.root=%AS_DERBY_INSTALL%"  

但我似乎无法找到任何转储文件。 我将使用Eclipse Memory Analyzer来分析何时找到转储。

我还尝试设置选项“-XX:HeapDumpPath = c:\ memdump \ bds.hprof”,但没有在那里创建转储。

任何人都知道我做错了什么? 提前致谢

5 个答案:

答案 0 :(得分:1)

我发现我可以使用SUN的VisualVM来获取堆转储,然后看到它。

简易解决方案

答案 1 :(得分:1)

它位于应用程序的工作目录中(即您启动它的位置)。如果进程没有必要的权限,我不确定会发生什么。也许,编写转储会无声地失败。

答案 2 :(得分:1)

你确定ANT是OOME的过程吗?它可能是由ANT启动的过程。

将“-debug”添加到ANT_OPTS以获取调试信息。

您是否在执行过程中看到目标被打印出来?

你也可以分叉由ant启动的各种进程(会减慢速度,但可能有助于隔离罪魁祸首)

最后,也许您只需要比默认内存更多的内存。添加:

-Xms256m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=256m

到ANT_OPTS

答案 3 :(得分:1)

您的应用程序似乎在Windows上运行。需要使用\转义Windows文件路径。根据您的示例,-XX:HeapDumpPath应如下所示:

-XX:HeapDumpPath=c:\\memdump\\bds.hprof

除了'-XX:+ HeapDumpOnOutOfMemoryError'之外,还有几个other options to capture heap dumps

答案 4 :(得分:-1)

嗯...... java.io.tmpdir指向的地方怎么样?