Answers:
试试这个:
class ForkRun(info: ProjectInfo) extends DefaultProject(info) {
override def fork = Some(new ForkScalaRun {
override def runJVMOptions = super.runJVMOptions ++ Seq("-Xmx512m")
override def scalaJars = Seq(buildLibraryJar.asFile, buildCompilerJar.asFile)
})
}
javaOptions
只有有分叉的JVM(见效果scala-sbt.org/0.13/docs/Forking.html)
fork in run := ture
启用javaOptions
对于分支的过程,您应该查看Build.scala
要修改分叉进程的Java选项,您需要在Build.scala(或您已命名的版本)中指定它们,如下所示:
val buildSettings = Defaults.defaultSettings ++ Seq(
//…
javaOptions += "-Xmx1G",
//…
)
这会给你正确的选项,而全球范围内修改JAVA_OPTS,并且它将把自定义JAVA_OPTS在 SBT生成的启动脚本
对于非分支进程,通过sbtopts
或设置配置最方便sbtconfig
取决于您的sbt版本。
由于sbt 0.13.6 .sbtconfig
已被弃用。修改/usr/local/etc/sbtopts
如下:
-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
您也可以.sbtopts
使用与/usr/local/etc/sbtopts
文件相同的语法在SBT项目的根目录中创建文件。这使项目自成一体。
在sbt 0.13.6之前,您可以在.sbtconfig中为非分支进程设置选项:
检查sbt在哪里:
$ which sbt
/usr/local/bin/sbt
看一下内容:
$ cat /usr/local/bin/sbt
#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.1/libexec/sbt-launch.jar "$@"
设置正确的jvm选项以防止OOM(常规和PermGen):
$ cat ~/.sbtconfig
SBT_OPTS="-Xms512M -Xmx3536M -Xss1M
-XX:+CMSClassUnloadingEnabled
-XX:+UseConcMarkSweepGC -XX:MaxPermSize=724M"
如果只想为当前sbt设置SBT_OPTS,则可以env SBT_OPTS=".." sbt
按照Googol Shan的建议使用。或者,您可以使用Sbt 12:中添加的选项sbt -mem 2048
。对于较长的选项列表,这显得很笨拙,但是如果您有不同需求的不同项目,则可能会有所帮助。
请注意,与UseConcMarkSweepGC配合使用的CMSClassUnloadingEnabled有助于保持PermGen空间的清洁,但是根据您使用的框架,PermGen上可能实际泄漏,最终迫使重新启动。
.sbtopts
使用与/usr/local/etc/sbtopts
文件相同的语法在SBT项目的根目录中创建文件。这使您的项目自成一体,这在CI情况下非常方便。
从sbt版本12开始,有一个选项供您选择:
$sbt -mem 2048
Not a valid command: mem (similar: set)
如果在Linux Shell上运行sbt,则可以使用:
env JAVA_OPTS="-Xmx512m" sbt run
这是我通常使用的命令来运行我的sbt项目。
override def fork
上面的解决方案。(sbt 0.7.7)
.sbtconfig
从SBT开始不推荐使用0.13.6
。相反,我/usr/local/etc/sbtopts
以以下方式配置了这些选项:
-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
-J-Xss1M
对于大型案例类来说,它有点低,4M似乎更安全。
在javaOptions += "-XX:MaxPermSize=1024"
用如上述对我们工作时,我们看到,同时通过SBT运行Specs2测试抛出java.lang.OutOfMemoryError @iwein引用我们build.sbt。
环境变量是_JAVA_OPTIONS,需要设置。设置_JAVA_OPTIONS后,当您设置sbt时,sbt将使用JAVA_OPTIONS及其值显示消息。
或者,您可以在sbt或.scala文件中设置javaOption,例如
javaOptions += "-Xmx1G"
您可以从sbt shell运行show javaOptions来查看设置的值。
javaOptions in Test += "-Xmx1G"
这将设置用于测试的JVM选项。也可以与jvm forking(fork in Test := true
)一起使用。
build.sbt
?
javaOptions in ThisBuild += "-Xmx1G"
或javaOptions in (ThisBuild, Test) += "-Xmx1G"
sbt允许您列出在名为的文件上运行项目所需的JVM选项
.jvmopts
在项目的根目录中。然后添加所需的Java选项
cat .jvmopts
-Xms512M
-Xmx4096M
-Xss2M
-XX:MaxMetaspaceSize=1024M
它已经过测试并且可以在Windows 10中运行 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html
javaOptions += "-Xmx1G"