【问题标题】:Heroku JVM memory quota exceeded but the numbers don't add upHeroku JVM 内存配额超出,但数字不加起来
【发布时间】:2015-03-19 18:53:10
【问题描述】:

我们在 Heroku 上运行的 JVM 应用程序收到错误 R14 超出内存配额。

我们正试图了解内存的使用情况,但数字没有加起来。

在日志下方:

 Process running mem=1174M(114.7%)
 » 10:16:28.365 2015-01-21 09:16:28.099931+00:00 heroku web.1 - - Error   R14 (Memory quota exceeded) Critical
 » 10:16:43.322 2015-01-21 09:16:42.836517+00:00 app web.1 - - measure.mem.jvm.heap.used=272M measure.mem.jvm.heap.committed=546M measure.mem.jvm.heap.max=546M
 » 10:16:43.322 2015-01-21 09:16:42.836583+00:00 app web.1 - - measure.mem.jvm.nonheap.used=106M measure.mem.jvm.nonheap.committed=107M measure.mem.jvm.nonheap.max=0M
 » 10:16:43.322 2015-01-21 09:16:42.836644+00:00 app web.1 - - measure.threads.jvm.total=136 measure.threads.jvm.daemon=21 measure.threads.jvm.nondaemon=105 measure.threads.jvm.internal=10
 » 10:16:43.322 2015-01-21 09:16:42.853114+00:00 app web.1 - - measure.mem.linux.vsz=2489M measure.mem.linux.rss=848M

Heroku 报告 1174M 正在被使用。 heroku-javaagent-1.4 报告其下方的指标,它们加起来为 546+107+136/2=721M1174-721=453M 的其余部分可以用在哪里?我们如何才能继续进行故障排除?

考虑到我们的 JVM 选项,我在这里计算了 136 个线程,每个线程有 512K 堆栈:

-javaagent:heroku-javaagent-1.4.jar=stdout=true,lxmem=true -Xms568m -Xmx568m -Xmn192m -Xss512k -XX:+UseCompressedOops

用于在 1024M 内存的 2 倍测功机上运行。

谢谢

【问题讨论】:

    标签: java memory heroku jvm


    【解决方案1】:

    这里有几种可能性。最有可能的是某些东西正在为某种 IO 分配本机内存映射。报告 JVM 内存使用情况的工具看不到这一点。最常见的是,Java NIO ByteBuffer 对象会发生这种情况。这可以通过您的代码中的某些内容来完成,这可能表明您的应用程序中存在内存泄漏。或者它可以由构建您的应用程序的框架/服务器来完成。

    我发现 Play 框架和 Jetty 在这方面特别糟糕。在许多情况下,它们分配了数百兆字节的本机内存。你正在使用其中任何一个吗?我知道有人从 Jetty 切换到 Tomcat 并解决了这个问题。

    最终,如果额外内存达到稳定状态,则可能没问题。这正是您的应用程序运行所需要的。但是如果你发现它一直在增长,那么它可能表明内存泄漏。

    我建议在 Heroku 的支持下提交工单,他们可以使用 smaps 提供有关此内存分配位置的更多信息。

    完全披露:我为 Heroku 工作。

    【讨论】:

    • 感谢您的回答。我确实使用Jetty,可以很容易地进行Tomcat切换,将尝试一下。不要使用 Play 而是 Lift。
    【解决方案2】:

    确实,这个问题已经存在了很长时间。但我最近遇到了同样的问题。

    解决方案是为我的静态文件配置服务器。静态文件可以使用 Nginx。

    确实,静态文件的加载是通过I/O请求来消耗内存的。

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2013-07-13
    • 2017-11-02
    • 2012-11-02
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多