3

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

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。有什么解决办法吗?

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

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

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

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

谢谢大家的时间

4

1 回答 1

5

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

于 2013-02-12T13:54:39.797 回答