如何在Eclipse中保存堆(转储到文件)?

5
当我在MyEclipse中运行或调试GA / AI时,出现以下错误:
“主线程中的异常” java.lang.OutOfMemoryError:“Java堆空间”
eclipse.ini看起来像这样:
-showsplash com.genuitec.myeclipse.product
--launcher.XXMaxPermSize 256m
-vmargs
-Xms128m
-Xmx512m
-Duser.language=en 
-XX:PermSize=128M 
-XX:MaxPermSize=256M

MyEclipse被称为:

"C:\Program Files\MyEclipse 6.0\eclipse\eclipse.exe" -vm "C:\Program Files\MyEclipse 6.0\jre\bin\javaw.exe"  -vmargs -Xms1448M -Xmx1448M

将虚拟机设置提升,从这个值开始:
"C:\Program Files\MyEclipse 6.0\eclipse\eclipse.exe" -vm "C:\Program Files\MyEclipse 6.0\jre\bin\javaw.exe"  -vmargs -Xms80M -Xmx1024M

目前还没有任何效果。因此,我正在尝试将其转储到文件中,但是需要添加以下内容:

-XX:+HeapDumpOnCtrlBreak
-XX:+HeapDumpOnOutOfMemoryError

在程序参数中没有起作用。我该如何使用更多的内存使用分析工具?例如,在Windows平台上当前无法使用jstack。而使用SendSignal似乎没有任何效果。

屏幕截图


尝试将XXMaxPermSize增加。 - Thilo
3个回答

11

获取堆转储文件的方法有很多种。以下是我使用过的一些方法:

  1. -XX:+HeapDumpOnOutOfMemoryError 可以在 OOM 时自动导出堆转储文件。
  2. 使用免费的可视化工具 VisualVM 并使用其 GUI 强制导出堆转储文件。
  3. 使用商业性能分析工具(如 JProfiler,YourKit 等)。
  4. 使用 jmap 命令(详见下文)从运行中的进程中强制导出堆转储文件。

如果你正在运行 Java 6,jmap 可用于 Windows 系统。如果你想导出堆转储文件但尚未遇到 OOM,可以使用 Windows 任务管理器查找 Java 应用程序的 pid,并在控制台中运行以下命令:

jmap -dump:format=b,file=c:\heap.bin <pid>

除了VisualVM外,Eclipse Memory Analyzer(也是免费的)可以帮助你分析在你获得dump文件后占用所有空间的原因。


当我运行主函数时,在VisualVM中创建了一个应用程序,但没有转储功能:无法进行堆转储、线程转储,也没有堆选项卡等。 - Dave Babbitt
如果 -XX:+HeapDumpOnOutOfMemoryError 能够正常工作,那么它在我的系统上会是什么样子? - Dave Babbitt
jps 命令会输出 pid 进程号。 - ssedano
1
你的jmap语法在Windows 7和Java 7中完美运行。谢谢! - KomodoDave
使用Java VisualVM创建了堆转储,但是如何将其保存到文件中呢? - Aequitas

2

-XX:+HeapDumpOnOutOfMemoryError 应该放在 "VM Arguments" 而不是 "Program Arguments"。


1

您可以使用JConsole监视内存使用情况。

jstat也会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接