如何防止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.它们对于防止与permgen或metaspace耗尽相关的内存不足错误至关重要 。 当然,考虑适应标志值或添加其他所需的标志。
更多细节和替代方法可以在这篇博客中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"