我注意到我的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编译。
有没有人知道造成这个错误的原因是什么?提前感谢您的见解。
答案 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