对Scala Play中的“内存不足错误:元空间”进行故障排除

时间:2018-07-02 16:06:02

标签: scala playframework playframework-2.5

在Play for Scala(2.5.x)中以开发模式工作时,在更改代码和热部署大约三个小时之后,Play挂起并出现错误java.lang.OutOfMemoryError: Metaspace

经过一些研究,问题似乎出在,该应用程序实例化了Play无法识别的Java对象(例如工厂和连接),并且当Play重新启动时,这些对象留在内存中导致泄漏。解决方案是按照here所述在Play关闭时清理组件,或在使用它们后销毁它们。

问题是我清理了所有这些对象,但仍然得到OutOfMemoryError。我尝试使用Java的jconsole来找出导致泄漏的类以及它们占用了多少内存,但找不到太多。有什么想法如何处理这种情况?我不想在不知道发生什么情况的情况下简单地增加内存。

PS:这似乎是一个常见问题,如果Play本身提供检测问题的工具,那就太好了。

1 个答案:

答案 0 :(得分:4)

不幸的是,目前看来这个问题是不可避免的。尽管在Play 2.6中变得更好,但我仍然遇到了这个问题。

这与未清理组件无关,元空间是加载类的地方。 Play(动态)在编译时会创建很多类(例如,匿名类),并且每个类都会添加到元空间中,并最终被填充。

我的建议是只增加-XX:MaxMetaspaceSize,直到您可以工作几个小时而没有这个例外。然后,不时重新启动sbt。我目前使用500 MB,这似乎还不错(SBT启动器通常为128 MB):

sbt -J-XX:MaxMetaspaceSize=500m

这通常在生产中没有问题,因为您加载了固定数量的类(生产中没有编译)。