Scala “故障排除”;内存不足错误:Metaspace“;为斯卡拉效力

Scala “故障排除”;内存不足错误:Metaspace“;为斯卡拉效力,scala,playframework,playframework-2.5,Scala,Playframework,Playframework 2.5,在Scala(2.5.x)的开发模式下工作时,在大约三个小时的代码更改和热部署之后,使用错误java.lang.OutOfMemoryError:Metaspace来播放hungs 经过一些研究,问题似乎是应用程序实例化了Play不知道的Java对象(如工厂和连接),当Play重新启动时,这些对象留在内存中,导致泄漏。解决方案是在播放关闭时按说明清理组件,或在使用后销毁组件 问题是我清理了所有这些对象,但仍然得到OutOfMemoryError。我尝试使用Java的jconsole来找出是什么类

在Scala(2.5.x)的开发模式下工作时,在大约三个小时的代码更改和热部署之后,使用错误
java.lang.OutOfMemoryError:Metaspace
来播放hungs

经过一些研究,问题似乎是应用程序实例化了Play不知道的Java对象(如工厂和连接),当Play重新启动时,这些对象留在内存中,导致泄漏。解决方案是在播放关闭时按说明清理组件,或在使用后销毁组件

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


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

不幸的是,目前这个问题似乎是不可避免的。虽然在游戏2.6中效果更好,但我还是遇到了这个问题

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

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


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

这在增量编译的开发环境中非常常见,您可以查看在上建议的选项,谢谢,但我想在增加内存之前分析问题,我想消除这个问题,以防它在生产中造成复杂的问题。如果我不清理我使用的一些Java库,这个问题似乎更为常见。这可能是这些类和Play编译类的组合吗?是的,这是可能的。但最有可能的罪魁祸首是由于重新编译而用一些类加载器魔法重新加载类。
sbt -J-XX:MaxMetaspaceSize=500m