81

I have noticed a strange behavior of my scala compiler. It occasionally throws an OutOfMemoryError when compiling a class. Here's the error message:

[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

It only happens once in a while and the error is usually not thrown on the subsequent compile run. I use Scala 2.9.0 and compile via SBT.

Does anybody have a clue as to what might be the cause for this error? Thanks in advance for your insights.

4

9 回答 9

100

我使用 HomeBrew 在 OS X 上安装 sbt。它支持一个SBT_OPTS可以~/.sbtconfig使用export SBT_OPTS=-XX:MaxPermSize=256M.

于 2012-10-11T03:12:21.867 回答
47

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

于 2011-11-30T20:36:04.983 回答
38

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

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

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

可以在此博客文章中找到更多详细信息和替代方法。

于 2015-03-28T14:48:03.027 回答
6

我遇到了这个问题,在试图改变内存大小的网站上玩了 10 分钟。

原来我解决了它,

user-profile$ sbt

然后,

sbt-project-name 0.1> clean

这为我清除了它。

于 2013-08-11T02:55:14.260 回答
5

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

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

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

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

于 2013-02-22T00:35:34.070 回答
3

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

于 2014-07-25T18:59:30.567 回答
3

最初使用如下命令:

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

我得到了第一个 OutOfMemoryError: PermGen space which Isolved using -XX:MaxPermSize,然后是 OutOfMemoryError: Java heap space,这-Xmx是补救措施。

所以就我而言,这样的命令有效:

java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test
于 2015-10-14T14:06:50.623 回答
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 配置

export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
于 2017-08-30T07:00:43.563 回答
0

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

-Xms1g
-Xmx4g
于 2021-03-25T18:29:32.383 回答