Java“Out of memory error” - 堆/系统 - 在哪里看?

时间:2012-06-05 08:16:40

标签: java tomcat memory heap

在我的Tomcat应用程序中,我最终得到“Out of memory”和“无法分配内存”错误。我认为它与堆无关,因为它完全占用了系统内存,我几乎无法运行bash命令。

这个问题是如何连接到堆的?如何正确设置堆大小以使应用程序具有足够的内存,因此不会占用太多的系统资源?

奇怪的是,“top”命令一直说tomcat只消耗了20%的mem,并且一旦出现问题,仍然有空闲内存。

感谢。

编辑:

随访: BufferedImage leaks - are there any alternatives?

4 个答案:

答案 0 :(得分:2)

运行bash脚本的问题可能表示I/O问题,如果您的JVM始终执行 Full GCs ,情况可能就是这种情况(如果您的堆是几乎满)。

要做的第一件事是使用-Xmx增加堆。这可以解决问题,或者 - 如果你有内存泄漏,它就不会,你最终会再次获得OutOfMemoryError

在这种情况下,您需要分析内存转储。有关说明,请参阅my answer in this thread

此外,启用垃圾收集日志(使用-Xloggc:/path/to/log.file -XX:+PrintGCDetails)然后使用GCViewerHPJmeter进行分析可能会很有用。

答案 1 :(得分:0)

您可以通过指定选项

来设置JVM堆大小
-Xmx1024m  //for 1024 MB

请参阅此选项以设置Tomcat

的选项

答案 2 :(得分:0)

如果你有4 GB ram,那么可以为HEAP分配3GB -

-Xmx3GB

答案 3 :(得分:0)

您还可以使用以下命令更改可用的perm gen大小:

-XX:PermSize =128米 -XX:MaxPermSize参数=256米