Play框架中控制器的内存泄漏?

时间:2013-02-12 12:56:50

标签: scala playframework-2.0 playframework-2.1

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

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以及异步相同的问题。不包括其他进口或特性。就是你所看到的。

我有一段时间没有这个问题,没有System.gc()就无法部署到Heroku。任何解决方案?

UPDATE 其实JAVA_OPTS不被heroku使用(傻我)你必须将它声明为Procfile

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

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

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

谢谢你的时间eveyone

1 个答案:

答案 0 :(得分:5)

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