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

我注意到了我的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 

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

有没有人有线索,可能是什么原因造成这个错误? 提前感谢您的见解。

导致OutOfMemoryError: PermGen space的原因是它没有足够的永久生成空间 :)如果使用Oracle JVM,则需要将-XX:MaxPermSize=256M (或其他空间量)参数添加到您的sbt脚本。 对于其他JVM,请看他们的文档。

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

我以为你正在使用sbt 0.13.6或更高。 在你的sbt项目的根目录下创build.sbtopts文件,内容如下:

 -J-Xmx4G -J-XX:MaxMetaspaceSize=1G -J-XX:MaxPermSize=1G -J-XX:+CMSClassUnloadingEnabled 

MaxMetaspaceSize用于Java 8,而MaxPermSize用于Java 7.它们对于防止与permgenmetaspace耗尽相关的内存不足错误至关重要 。 当然,考虑适应标志值或添加其他所需的标志。

更多细节和替代方法可以在这篇博客中find。

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

原来我解决了,

 user-profile$ sbt 

然后,

 sbt-project-name 0.1> clean 

这清理了我。

它看起来像SBT中的内存泄漏,在我的情况下,程序编译并成功运行了大约3-5次,然后触发由SBT重新启动修复的exception。

最合适的解决scheme似乎确实是-XX:MaxPermSize= JVM参数,如Alexey Romanovbuild议或如果有帮助,重新启动SBT。

但还有一个有趣的方法:尝试切换到Java 8 。 AFAIK它不再使用PermGen,并可能免除这种exception。

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

我正在与jenkinssbt插件build设,并有同样的问题。 将SBT_OPTS从sbt文件复制到Jenkins作业configuration的JVM标志后,它们被parsing。

最初使用如下命令:

 java -jar /path/to/sbt-launch.jar test 

我得到了第一个OutOfMemoryError:我使用-XX:MaxPermSize解决的PermGen空间 -XX:MaxPermSize ,然后是OutOfMemoryError: Java堆空间 ,其中-Xmx是补救措施。

所以在我的情况下,这样的命令工作:

 java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test 

更改sbt.sh文件中的以下代码块并保存其工作正常。

 get_mem_opts () { local mem=${1:-1536} local perm=$(( $mem / 4 )) (( $perm > 256 )) || perm=1024 //256 to 1024 (( $perm < 1024 )) || perm=2048 // 1024 to 2048 local codecache=$(( $perm / 2 )) echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m" } 

要么

使用terminal来导出sbtconfiguration

 export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"