【问题标题】:Heroku memory leak with Play2 scala使用 Play2 scala 的 Heroku 内存泄漏
【发布时间】:2012-11-02 11:15:47
【问题描述】:

正在对我的 1 个 heroku dyno 和 dev 数据库进行一些拉伸 (ab) 测试,连接数限制为 20。

在调用期间(使用 squeryl 访问数据库,堆分配增加导致 R14(内存超过 512MB))

我似乎无法重现该问题(至少在本地)。

有什么方法可以获取 heroku 堆转储并对其进行分析以获取一些线索?

play2、scala、squeryl 和 heroku 内存泄漏是否存在任何已知问题?

更新

如果我在控制器末尾执行 System.gc,一切似乎都很好,而且速度较慢...我在该调用中创建了很多对象,但 heroku 的 JVM 不应该处理 gc 吗?另外,如果我定期安排 gc 调用,请不要释放内存

【问题讨论】:

  • 你使用 Streaming(返回块)吗?
  • 不,我没有。如果我在控制器末尾执行 System.gc,一切似乎都很好,而且速度较慢...我在该调用中创建了很多对象,但 herokus JVM 不应该处理 gc 吗?另外,如果我定期安排 gc 调用,请不要释放内存..
  • 你是否使用Procfile中的默认JAVA_OPTS
  • JAVA_OPTS => -Xmx384m -Xss512k -XX:+UseCompressedOops

标签: scala heroku playframework-2.0 squeryl


【解决方案1】:

有一篇很棒的文章可以解决 Heroku 上的内存问题: https://devcenter.heroku.com/articles/java-memory-issues

在您的情况下,您可以将 GC 标志添加到 JAVA_OPTS 以查看内存详细信息。我建议以下标志:

heroku config:add JAVA_OPTS="-Xmx384m -Xss512k -XX:+UseCompressedOops -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps"

如果您想从 JMX 获得更多关于您的内存的信息,还可以添加一个简单的 Java 代理到您的进程中。如果你想更深入地了解,你也可以看看像 New Relic 这样的监控插件,但我认为你应该对标志和 java 代理没问题。

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,并回答了here

    我有同样的问题。 Heroku 告诉你机器快用完了 内存,而不是 Java VM。 Heroku Play 中实际上存在一个错误 2.2部署,启动脚本读取的是java_opts,不是JAVA_OPTS。

    我通过设置两者来修复它:

    heroku config:add java_opts='-Xmx384m -Xms384m -Xss512k -XX:+UseCompressedOops'
    heroku config:add JAVA_OPTS='-Xmx384m -Xms384m -Xss512k -XX:+UseCompressedOops'
    

    我还必须设置 -Xms 否则我得到一个错误,说最小值和最大值 是不相容的。我猜 Play2.2 使用的默认值高于 384m。

    【讨论】:

    • 仅供参考。这不再是问题。部署了一个 play 2.3 应用程序,它可以很好地获取 JAVA_OPTS。
    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2011-12-08
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多