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

Dav*_*itt 5 java heap memory-leaks

当我从MyEclipse运行或调试我的GA/AI时,我收到此错误:

线程"main"中的异常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
Run Code Online (Sandbox Code Playgroud)

像这样调用MyEclipse:

"C:\Program Files\MyEclipse 6.0\eclipse\eclipse.exe" -vm "C:\Program Files\MyEclipse 6.0\jre\bin\javaw.exe"  -vmargs -Xms1448M -Xmx1448M
Run Code Online (Sandbox Code Playgroud)

碰撞vm设置:

"C:\Program Files\MyEclipse 6.0\eclipse\eclipse.exe" -vm "C:\Program Files\MyEclipse 6.0\jre\bin\javaw.exe"  -vmargs -Xms80M -Xmx1024M
Run Code Online (Sandbox Code Playgroud)

没有效果.所以我试图让它将堆转储到一个文件,但放置这些:

-XX:+HeapDumpOnCtrlBreak
-XX:+HeapDumpOnOutOfMemoryError
Run Code Online (Sandbox Code Playgroud)

在程序参数中没有任何效果.如何使用更多的内存使用情况分析?例如,jstack目前在Windows平台上不可用.使用SendSignal没有我能看到的效果.

一个屏幕截图

ove*_*ink 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>
Run Code Online (Sandbox Code Playgroud)

除了VisualVM之外,Eclipse Memory Analyzer(也是免费的)可以帮助您分析在转储后占用所有空间的内容.