1

在我的 Tomcat 应用程序中,我最终收到“内存不足”和“无法分配内存”错误。我想这与堆无关,因为它完全填满了系统内存,我几乎无法运行 bash 命令。

这个问题是如何连接到堆上的?如何正确设置堆大小,以便应用程序有足够的内存,从而不会消耗过多的系统资源?

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

谢谢。

编辑:

跟进: BufferedImage 泄漏 - 有没有其他选择?

4

4 回答 4

2

运行 bash 脚本的问题可能表明存在I/O问题,如果您的 JVM 一直在执行Full GC(如果您的堆几乎已满),情况可能就是这种情况。

首先要做的是增加堆-Xmx。这可能会解决问题,或者 - 如果你有内存泄漏,它不会,你最终会OutOfMemoryError再次得到。

在这种情况下,您需要分析内存转储。有关一些说明,请参阅我在此线程中的回答。

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

于 2012-06-05T08:38:44.910 回答
0

您可以通过指定选项来设置 JVM 堆大小

-Xmx1024m  //for 1024 MB

请参阅此处以设置Tomcat的选项

于 2012-06-05T08:19:02.063 回答
0

如果您有 4 GB 内存,则可以为 HEAP 分配 3GB -

-Xmx3GB

于 2012-06-05T08:20:01.070 回答
0

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

-XX:PermSize=128m -XX:MaxPermSize=256m

于 2012-06-05T08:23:41.070 回答