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

时间:2011-11-30 18:41:01

标签: scala apache-spark memory-management sbt scalatra-sbt

我注意到我的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编译。

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

9 个答案:

答案 0 :(得分:99)

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

答案 1 :(得分:46)

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

答案 2 :(得分:36)

我认为您使用 sbt 0.13.6或更高版本。使用以下内容在 sbt 项目的根目录中创建.sbtopts文件:

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

MaxMetaspaceSize适用于Java 8,而MaxPermSize适用于Java 7.它们对于防止与 permgen 元空间相关的内存不足错误至关重要

可以在此blog post中找到更多详细信息和替代方法。

答案 3 :(得分:5)

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

原来我解决了,

user-profile$ sbt

然后,

sbt-project-name 0.1> clean

这为我解决了。

答案 4 :(得分:4)

对于我而言,它看起来像SBT中的内存泄漏,因为在我的情况下程序编译并成功运行大约3-5次,然后才能通过SBT重新启动修复异常。

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

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

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

答案 5 :(得分:2)

我正在使用Jenkins sbt插件构建并遇到同样的问题。将SBT_OPTS从sbt文件复制到Jenkins作业配置的JVM标志后,它们得到了解决。

答案 6 :(得分:2)

最初使用如下命令:

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

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

所以在我的情况下,这样的命令起作用了:

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

答案 7 :(得分:0)

更改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"
}

使用终端导出sbt config

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

答案 8 :(得分:0)

您还可以在项目的根文件夹中添加一个 completion 文件,并在文件中写入以下内容:

.jvmopts