如何指定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生成的启动脚本中
对于非分叉进程,通过sbtopts
或sbtconfig
根据您的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中为非分叉进程设置选项:
-
检查哪里是:
$ 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_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
)。