1

当我在具有 4 x 1.6GHZ 内核和 7G RAM 的 Window Azure 上运行我的 Java 应用程序时Ubuntu 12.04 VM,几分钟后出现以下内存不足错误。

java.lang.OutOfMemoryError:超出 GC 开销限制

我的交换大小为 15G 字节,最大堆大小设置为 2G。我正在使用 Oracle Java 1.6。增加最大堆大小只会延迟内存不足错误。似乎 JVM 没有进行垃圾收集。

但是,当我在本地 Windows 8 PC (core i7) 上运行上述 Java 应用程序时,使用相同的 JVM 参数,它运行良好。堆大小永远不会超过 1G。

Windows Azure linux VM 上是否有任何用于运行 Java 应用程序的额外设置?

4

2 回答 2

1

在 Azure VM 上,我使用了以下 JVM 参数

-XX:+HeapDumpOnOutOfMemoryError

获得堆转储。堆转储显示一个参与者邮箱,Camel 消息占用了所有 2G。在我的 Akka 应用程序中,我使用 Akka Camel Redis 将处理后的消息发布到 Redis 通道。当我将上面的骆驼演员存根时,内存不足错误消失了。看起来 Akka Camel Redis Actor 在 VM 上性能不佳,它的 CPU 时钟速度比我的 Xeon CPU 慢。

于 2013-09-08T21:46:25.640 回答
0

GC当在垃圾收集中花费太多时间而没有收集任何东西时,将引发此异常。我相信默认设置是 98% 的 CPU 时间都花在GC了只有 2% 的堆上被恢复。

这是为了防止由于堆太小而导致应用程序长时间运行而没有任何进展。

您可以使用命令行选项将其关闭-XX:-UseGCOverheadLimit

于 2013-09-06T16:05:07.473 回答