在我的 Tomcat 应用程序中,我最终收到“内存不足”和“无法分配内存”错误。我想这与堆无关,因为它完全填满了系统内存,我几乎无法运行 bash 命令。
这个问题是如何连接到堆上的?如何正确设置堆大小,以便应用程序有足够的内存,从而不会消耗过多的系统资源?
奇怪的是,一旦问题发生,“top”命令一直说tomcat 只消耗20% 的内存并且仍然有空闲内存。
谢谢。
编辑:
在我的 Tomcat 应用程序中,我最终收到“内存不足”和“无法分配内存”错误。我想这与堆无关,因为它完全填满了系统内存,我几乎无法运行 bash 命令。
这个问题是如何连接到堆上的?如何正确设置堆大小,以便应用程序有足够的内存,从而不会消耗过多的系统资源?
奇怪的是,一旦问题发生,“top”命令一直说tomcat 只消耗20% 的内存并且仍然有空闲内存。
谢谢。
编辑:
运行 bash 脚本的问题可能表明存在I/O
问题,如果您的 JVM 一直在执行Full GC(如果您的堆几乎已满),情况可能就是这种情况。
首先要做的是增加堆-Xmx
。这可能会解决问题,或者 - 如果你有内存泄漏,它不会,你最终会OutOfMemoryError
再次得到。
在这种情况下,您需要分析内存转储。有关一些说明,请参阅我在此线程中的回答。
此外,启用垃圾收集日志(使用-Xloggc:/path/to/log.file -XX:+PrintGCDetails
)然后使用GCViewer或HPJmeter分析它们可能很有用。
如果您有 4 GB 内存,则可以为 HEAP 分配 3GB -
-Xmx3GB
您还可以使用以下命令更改可用的 perm gen 大小:
-XX:PermSize=128m -XX:MaxPermSize=256m