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

从这里提高 vm 设置:

"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

在程序参数中没有任何效果。如何通过更多的内存使用分析得到一些东西?例如,jstack 目前在 Windows 平台上不可用。并且使用 SendSignal 没有我能看到的效果。

屏幕截图

4

3 回答 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 内存分析器(也是免费的)可以帮助您分析在获得转储后占用所有空间的原因。

于 2009-05-08T04:56:22.307 回答
2

-XX:+HeapDumpOnOutOfMemoryError应该放在“ VM Arguments”而不是“ Program Arguments

于 2012-10-19T09:34:12.350 回答
1

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

jstat也会有所帮助。

于 2009-05-08T04:15:19.160 回答