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

Java 如何在Eclipse中保存堆(转储到文件)?,java,memory-leaks,heap,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

当我从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
"C:\Program Files\MyEclipse 6.0\eclipse\eclipse.exe" -vm "C:\Program Files\MyEclipse 6.0\jre\bin\javaw.exe"  -vmargs -Xms1448M -Xmx1448M
MyEclipse的名称如下:

-showsplash com.genuitec.myeclipse.product
--launcher.XXMaxPermSize 256m
-vmargs
-Xms128m
-Xmx512m
-Duser.language=en 
-XX:PermSize=128M 
-XX:MaxPermSize=256M
"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没有我所看到的效果


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


也会有所帮助。

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

  • -XX:+HeapDumpOnOutOfMemoryError
    如果你点击了OOM,应该会被转储
  • 连接(免费)并使用其GUI强制堆转储
  • 使用众多优秀的商业分析器之一(JProfiler、YourKit等)
  • 使用jmap(见下文)强制从正在运行的进程转储
  • 如果您运行的是Java 6,则应该可以在Windows上运行。如果您想转储堆,但还没有达到OOM,这可能很有用。使用Windows任务管理器查找Java应用程序的pid,并在控制台中运行以下命令:

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

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

    -XX:+heapdumponAutofmemoryError
    应该放在“
    虚拟机参数”中,而不是“
    程序参数”

    在运行主函数时也可以尝试增加XXMaxPermSize,在VisualVM中创建的应用程序没有转储功能:您不能堆转储、线程转储、没有堆选项卡等。如果-XX:+HeapDumpOnOutOfMemoryError起作用,它在我的系统上会是什么样子?jps输出pid进程以及您的jmap语法在使用Java 7的Windows 7中发挥了巨大的作用。非常感谢。使用Java VisualVM,我创建了一个堆转储,但如何将其保存到文件中?