内存不足 CPU 消耗

Out of memory with low CPU consumption

我正在尝试调整某种高负载应用程序,它通过一些预处理将数据从一个云流式传输到另一个云。 我的应用程序的具体特点是大量内存使用和低 CPU 消耗。 我用 jconsole 监视了应用程序并得到了一些有趣的图片 - cpu 加载了 15%,但我仍然遇到内存不足错误。

从 jconsole 手动触发 "Perform GC" 会清除所有代中的大量内存,因此我假设应用程序中没有内存泄漏。

我的应用程序是 运行 mesos/marathon,所以我尝试在单个虚拟 CPU 和具有各种 GC 的多个 CPU 之间切换(-XX:+UseG1GC; -XX:+UseParallelGC 没有其他调优)和图片其实是一样的;

运行时指标:

系统配置:

我想我应该分享我的调查结果。

"Out of memory" - 是我从 DevOps 专家那里得到的,我首先想到的是 - OutOfMemoryException。所以,感谢 Alex .

在我的例子中,它是来自底层 OS 的 docker 环境中的 OOMKill。我为容器分配了 1G,并将 java 堆大小限制为 736m。 但是我的应用程序使用了 netty,它绕过堆分配了自己的内存缓冲区。因此,当出现更多连接时,netty 会分配更多直接缓冲区,这会导致 OOMKill,尽管堆是健康的。

GC 运行s 当需要应用程序释放内存时。 GC 是一项昂贵的操作,只有在需要时才会 运行。 我不确定您为什么要尝试将 CPU 利用率与 运行ning GC 相关联。 CPU 利用率与 运行ning GC 应用程序无关。 如果 VM 线程决定 GC 到 运行,它将暂停所有应用程序线程 运行ning(安全点)并允许 GC 执行操作,因此 CPU Java 正在使用的数量仍然存在一样的,不管你还剩多少CPU

有许多 GC 标志可用于微调您的应用程序,我无法提供任何建议,因为不确定您的应用程序到底是什么?

以下链接可能会对您有所帮助 http://www.cubrid.org/blog/dev-platform/how-to-tune-java-garbage-collection/ https://confluence.atlassian.com/enterprise/garbage-collection-gc-tuning-guide-461504616.html

你应该知道你在哪里得到 OOM、老一代、Metaspace、Codegen 或本机基于你可以用堆选项微调