【问题标题】:Memory leak in Controllers in PlayFramework?PlayFramework 中的控制器内存泄漏?
【发布时间】:2013-01-27 19:01:09
【问题描述】:

我有这个非常简单的控制器。

package controllers.WebService

import play.api.mvc.{Action, Controller}

object TestLeak extends Controller {
  def index = Action {
    Ok((1 to 100000).mkString)
  }
}

我用浏览器打开它,我系统中的内存消耗为 2516MB。 每次我刷新页面内存时,每次刷新都会增加 1-2MB。您可能会说这是浏览器的错,但我从另一台 PC 上点击它并得到相同的结果。 ab bench 也证实了这一点。 -c 100 -n 1000 以 600mb 启动内存消耗。

而且内存分配永远不会减少

使用 System.gc() 可以解决问题,但我的性能确实很低。怎么回事?

Akka.future 和 scala.future 和 async 也有同样的问题。不包括其他进口或特征。就是你所看到的。

我现在遇到这个问题有一段时间了,没有 System.gc() 就无法部署到 Heroku。有什么解决办法吗?

更新 实际上 JAVA_OPTS 不被 heroku 使用(我很傻)你必须将它声明给 Procfile

web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} ... 

JAVA_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops -Dfile.encoding=UTF8

不是内存消耗永远不会超过 500(heroku 限制)

谢谢大家的时间

【问题讨论】:

  • 如果内存在 GC 后回到初始状态,这不是内存泄漏,您可能需要 tweek JVM gc 参数以避免性能问题
  • “Java 就像老年痴呆症 - 它开始缓慢,然后占用你所有的记忆”。 JVM 以占用内存而不将其还给系统而闻名。在它真正减慢您的应用程序之前,调整 GC 可能实际上会损害它。
  • @AloisCochard 谢谢

标签: scala playframework-2.0 playframework-2.1


【解决方案1】:

我认为这与游戏无关。在我看来,这就像正常行为。 JVM 不会在请求后直接收集垃圾,它会自行决定(基于 gc 设置,可以修改)何时收集。您的应用程序是否因为内存不足而崩溃?您应该将 jconsole 附加到它,然后使用大量请求运行 ab,您将看到内存最终被释放。

【讨论】:

  • 谢谢。实际上,它的 -Xmx 参数错误。感谢您的意见
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 2012-07-30
  • 2012-11-16
  • 1970-01-01
  • 2011-09-04
  • 2012-01-15
  • 2012-02-29
  • 2019-10-13
相关资源
最近更新 更多