SBT在内存耗尽时停止运行

3

我试图在一个800MB内存的Docker容器中运行我的Scala应用程序 (docker run -m=800m mindlevel),但它在编译完成之前被杀死了。

[info] Compiling 10 Scala sources to /root/mindlevel-backend/target/scala-2.12/classes...
[info] 'compiler-interface' not yet compiled for Scala 2.12.1. Compiling...
[info]   Compilation completed in 8.631 s
/usr/local/sbt/bin/sbt-launch-lib.bash: line 58:    57 Killed                  "$@"

我尝试使用以下方法限制SBT的堆大小:

CMD ["sbt", "-mem", "700", "run"]

但在相同的地方,它仍然崩溃了。 没有对运行docker容器的任何限制,它可以正常运行。 当在EC2微型实例(1GB内存)上运行时,无论是否对SBT和Docker进行限制,它都会崩溃。

我是否遗漏了某些限制?


Scala编译器使用了大量的内存,你至少需要为JVM分配1G的内存。一个只有1GB内存的EC2实例是不够的。 - engineerC
@engineerC,如果不在实例上进行编译,使用少于1GB的内存运行是可行的。 - spydon
1个回答

4

为了使其在小于1GB堆上运行,我使用sbt assembly预编译了该项目,它会生成一个带有您的项目和所有依赖项的JAR包。

安装它,只需添加:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.5")

请将文件路径更改为project/assembly.sbt

然后使用sbt assembly生成jar文件,该文件将被放置在./target/scala-<VERSION>/<PROJECT>-assembly-1.0.jar

最后只需运行以下命令即可运行您的项目:

scala target/scala-<VERSION>/<PROJECT>-assembly-1.0.jar

现在低内存实例不需要编译步骤,因此许多项目即使内存少于建议的也能运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接