如何指定JVM最大堆大小“-Xmx”用于在SBT中运行带有“运行”操作的应用程序?

我的应用程序执行大数据数组处理,并且需要比JVM默认提供的更多的内存。 我知道在Java中它是由“-Xmx”选项指定的。 如何将SBT设置为使用特定的“-Xmx”值来运行具有“运行”操作的应用程序?

尝试这个:

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) }) } 

对于分叉进程,你应该看看Build.scala

要修改分叉进程的java选项,你需要在Build.scala(或者你命名你的版本)中指定它们,如下所示:

 val buildSettings = Defaults.defaultSettings ++ Seq( //… javaOptions += "-Xmx1G", //… ) 

这会给你适当的select,而不用全局修改JAVA_OPTS,它会把自定义的JAVA_OPTS放到一个sbt生成的启动脚本中

对于非分叉进程,通过sbtoptssbtconfig根据您的sbt版本设置configuration最为方便。

由于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 

您还可以使用与/ usr / local / etc / sbtopts文件中相同的语法在SBT项目的根目录中创build.sbtopts文件。 这使得项目独立。

在sbt 0.13.6之前,您可以在.sbtconfig中为非分叉进程设置选项:

  1. 检查哪里是:

     $ which sbt /usr/local/bin/sbt 
  2. 看内容:

     $ 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 "$@" 
  3. 设置正确的jvm选项以防止OOM(普通和PermGen):

     $ cat ~/.sbtconfig SBT_OPTS="-Xms512M -Xmx3536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:MaxPermSize=724M" 

如果你想设置SBT_OPTS仅用于当前运行,你可以像Googol Shanbuild议的那样使用env SBT_OPTS=".." sbt 。 或者你可以使用在Sbt 12: sbt -mem 2048添加的选项。 对于更长的选项列表来说,这会变得很笨重,但是如果你有不同的需求不同的项目,这可能会有所帮助。

请注意,CMSClassUnloadingEnabled与UseConcMarkSweepGC一致有助于保持PermGen空间清洁,但取决于您使用的是什么框架,可能会在PermGen上实际泄漏,最终强制重新启动。

在版本12以后,有一个选项:

 $sbt -mem 2048 

如果你在linux shell上运行sbt,你可以使用:

 env JAVA_OPTS="-Xmx512m" sbt run 

这是我通常使用的命令来运行我的sbt项目。

.sbtconfig已弃用从SBT 0.13.6开始。 相反,我通过以下方式在/usr/local/etc/sbtopts中configuration了这些选项:

 -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 

有一个我知道的方法。 设置环境variablesJAVA_OPTS。

 JAVA_OPTS='-Xmx512m' 

我还没有find一种方法来做到这一点作为命令参数。

使用JAVA_OPTS进行环境variables设置。

使用-JX选项来select各个选项,例如-J-Xmx2048 -J-XX:MaxPermSize = 512

较新版本的sbt有一个“-mem”选项。

上面的javaOptions += "-XX:MaxPermSize=1024"引用的build.sbt中的javaOptions += "-XX:MaxPermSize=1024"对于我们在运行Specs2通过sbttesting时看到抛出java.lang.OutOfMemoryError的情况非常有用。

环境variables是_JAVA_OPTIONS,需要设置。 一旦你设置了_JAVA_OPTIONS,并且当你sbt时,sbt将会使用JAVA_OPTIONS和值来显示消息。

或者,您可以在sbt或.scala文件中设置javaOption,例如

 javaOptions += "-Xmx1G" 

从sbt shell可以运行show javaOptions来查看设置的值。

  javaOptions in Test += "-Xmx1G" 

这为testing设置了JVM选项。 也可以使用jvm fork( fork in Test := true )。