如何防止java.lang.OutOfMemoryError:Scala编译中的PermGen空间?

Bum*_*Gee 79 memory-management scala sbt scalatra-sbt apache-spark

我注意到我的scala编译器有一种奇怪的行为.它在编译类时偶尔会抛出OutOfMemoryError.这是错误消息:

[info] Compiling 1 Scala source to /Users/gruetter/Workspaces/scala/helloscala/target/scala-2.9.0/test-classes...
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space
Run Code Online (Sandbox Code Playgroud)

它只会偶尔发生一次,并且通常不会在随后的编译运行中抛出错误.我使用Scala 2.9.0并通过SBT编译.

有没有人知道造成这个错误的原因是什么?提前感谢您的见解.

mic*_*liu 99

我使用HomeBrew在OS X上安装sbt.它支持一个SBT_OPTS可以放在~/.sbtconfig文件中的参数export SBT_OPTS=-XX:MaxPermSize=256M.


Ale*_*nov 46

原因OutOfMemoryError: PermGen space是它没有足够的永久生成空间 :)如果您使用的是Oracle JVM,则需要-XX:MaxPermSize=256Msbt脚本中添加(或其他一些空间)参数.对于其他JVM,请查看其文档.

  • 它看起来像SBT中的内存泄漏,因为程序在抛出由SBT重启修复的异常之前编译并运行成功约3-5次. (6认同)
  • 对于当前版本的`sbt`,你需要`-J-XX:MaxPermSize = 256M`而不是`-XX:MaxPermSize = 256M`.Tvaroh的答案更加准确和完整,而且它没有取笑这个问题. (4认同)
  • @BumbleGee不,`-Xmx`添加的内存不能用于PermGen. (3认同)

Tva*_*roh 36

我以为你使用的 0.13.6或更高的sbt.使用以下内容.sbtoptssbt项目的根目录中创建文件:

-J-Xmx4G
-J-XX:MaxMetaspaceSize=1G
-J-XX:MaxPermSize=1G
-J-XX:+CMSClassUnloadingEnabled
Run Code Online (Sandbox Code Playgroud)

MaxMetaspaceSize适用于Java 8,而MaxPermSize适用于Java 7.它们对于防止与permgen或元空间耗尽相关的内存不足错误至关重要.当然,请考虑调整标志值或添加所需的任何其他标志.

更多细节和替代方法可以在这篇博文中找到.


Iva*_*van 5

对我来说,这看起来像是 SBT 中的内存泄漏,因为在我的情况下,程序在遇到由 SBT 重启修复的异常之前成功编译并运行了大约 3-5 次。

最合适的解决方案确实似乎是-XX:MaxPermSize=JVM 参数,如 Alexey Romanov 建议的那样,或者如果有帮助,则定期重新启动 SBT。

但还有另一种有趣的方式:尝试切换到Java 8。AFAIK 它不再使用 PermGen,并且可能以这种方式不受此异常的影响。

我仍然希望 SBT 作者能在未来的版本中解决这个问题。


Ale*_*art 5

我有这个问题,用它玩了10分钟看着试图改变内存大小的网站.

结果我解决了,

user-profile$ sbt
Run Code Online (Sandbox Code Playgroud)

然后,

sbt-project-name 0.1> clean
Run Code Online (Sandbox Code Playgroud)

这为我解决了这个问题.