2013-02-12 22 views
3

我有这个非常简单的控制器。PlayFramework中控制器中的内存泄漏?

package controllers.WebService 

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

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

我用我的浏览器打开它,我的系统中的内存消耗是2516MB。 每次刷新页面内存时,每次刷新时都会增加1-2MB。你可能会说这是浏览器的错误,但我从另一台电脑上得到了同样的结果。 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 

不是内存消耗

UPDATE 永远不会高于500(Heroku的限制)

感谢您的时间eveyone

+2

如果GC之后内存回到初始状态,那么它不是内存泄漏,您可能需要微调JVM gc参数以避免性能问题 – 2013-02-12 13:51:28

+0

“Java就像是阿尔茨海默氏症 - 它启动缓慢,然后占用所有内存”。 JVM以占用内存而闻名,并且不会将其还给系统。直到它实际上减慢了你的应用程序,调整GC可能实际上损害了它。 – 2013-02-12 15:01:31

+0

@AloisCochard谢谢你, – weakwire 2013-02-12 15:09:57

回答

5

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

+0

谢谢。实际上它的错误参数是-Xmx。感谢您的输入 – weakwire 2013-02-12 15:10:33