我注意到我的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,看看他们的文档。
我使用自制软件安装在OS X SBT它支持SBT_OPTS
可以放在论证~/.sbtconfig
文件与export SBT_OPTS=-XX:MaxPermSize=256M
。
我假设你正在使用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的或耗尽元空间中有关内存不足错误。 当然,考虑改变标志值或添加所需的任何其他标志。
更多详细信息和替代方法都可以在此找到博客文章 。
我有这个问题,发挥与它周围10分钟看试图改变内存大小网站。
原来我解决它通过,
user-profile$ sbt
然后,
sbt-project-name 0.1> clean
这清除它适合我。
它看起来像在SBT内存泄漏对我来说在我的案件的程序编译和运行成功约3-5次打击是由SBT重启固定异常之前。
最合适的解决方案确实似乎是-XX:MaxPermSize=
JVM参数作为阿列克谢·罗曼诺夫建议或者定期重新启动SBT是否有帮助。
但还有另一种有趣的方法:尝试切换到Java的8 。 AFAIK它不使用任何PermGen的更多,可能是不受此异常这种方式。
我还是希望SBT作者将在未来的版本中解决这个问题。
我对詹金斯SBT插件构建和有同样的问题。 他们从SBT文件到詹金斯工作配置的JVM标志复制SBT_OPTS后得到解决。
最初使用像这样的命令:
java -jar /path/to/sbt-launch.jar test
我得到了第一的OutOfMemoryError: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"
}
要么
使用终端导出SBT配置
export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
文章来源: How to prevent java.lang.OutOfMemoryError: PermGen space at Scala compilation?