我正在使用具有2 GB RAM并使用Scala version 2.10.3 (Java HotSpot(TM) Client VM, Java 1.6.0_26)
和sbt 0.13.0-M2
的Ubuntu 10.04计算机。
我创建了一个包含20个源文件的Scala项目,并将其设置为使用sbt
进行构建。
如果我以交互方式运行sbt
(开始sbt
并输入compile
),一切正常。
如果我以批处理模式运行sbt
,即使用命令行
$ sbt compile
一切都恢复正常。
现在我想在更复杂的构建中运行sbt
(还涉及其他编程语言),所以我想从Makefile中启动sbt
。我的目标看起来像这样:
SBT_JAVA_OPT=-J-Xss64m -J-Xms64m -J-Xmx1024m -J-XX:MaxPermSize=256m
build-sbt:
@sbt ${SBT_JAVA_OPT} compile
调用
时$ make build-sbt
sbt
输出以下错误消息:
[info] Set current project to ... (in build file:...)
[error] java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: unable to create new native thread
[error] Use 'last' for the full log.
我再次启动sbt
并调用
> last compile
但这没有提供任何信息。
我不明白为什么从sbt
开始Makefile
会产生影响。 make
是否对其子进程可以使用的内存施加了一些限制?
所以:这是一个已知的问题吗?从sbt
开始Makefile
的正确方法是什么?
答案 0 :(得分:1)
您的问题在我的debian机器上可以重现。请查看this article,其中讨论了通过减少分配给java VM的内存来解决此错误:
您为JVM提供的内存越多,您获取java.lang.OutOfMemoryError的可能性就越大:当您有许多线程时无法创建新的本机线程异常。
我按如下方式更改了Makefile,构建成功:
SBT_JAVA_OPT=-J-Xss64m -J-Xms64m -J-Xmx512m -J-XX:MaxPermSize=256m
# ^^^ less memory
build-sbt:
/usr/bin/sbt -verbose -debug ${SBT_JAVA_OPT} compile
答案 1 :(得分:0)
如果你开始使用java 8,你甚至不需要再设置max perm大小了。只是一个信息,以防您考虑迁移到Java 8