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

时间:2009-05-07 22:17:20

标签: java memory-leaks heap

当我从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

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没有我能看到的效果。

a screen shot

3 个答案:

答案 0 :(得分:11)

有许多方法可以获得堆转储。以下是我使用过的一些内容:

  1. -XX:+HeapDumpOnOutOfMemoryError 应该让你在你的OOM上转储。
  2. 使用VisualVM(免费)连接并使用其GUI强制进行堆转储
  3. 使用许多优秀的商业资料中的一个(JProfiler,YourKit,...)
  4. 使用jmap(见下文)强制正在运行的进程转储
  5. 如果您正在运行Java 6,jmap应该适用于Windows。如果要转储堆并且没有命中OOM,这可能很有用。使用Windows任务管理器查找Java应用程序的pid,并在控制台中运行:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

jstat也会有所帮助。