【发布时间】: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