如何为sbt设置堆大小?

我正在使用SBT 0.12.0。 我已经阅读了堆栈溢出的其他答案,并遵循他们,但是没有一个帮助,例如:

  • 创buildForkRun类 – 我在使用sbt期间没有观察到任何分叉进程
  • 设置环境variablesJAVA_OPTS – 它被设置,但sbt的进程命令行似乎并没有使用它。
  • sbt -J-Xmx2G将参数附加到sbt进程命令行,但是旧值-Xmx1536m由sbt使用,而不是附加参数。

我错过了什么吗? 在进行testing和run时,如何为sbt 0.12设置堆大小?

你需要SBT_OPTS ,这是我在.bash_profile中使用的:

 export SBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M -Duser.timezone=GMT" 

更新:为了得到你的2G堆空间,你可以使用这个:

 export SBT_OPTS="-Xmx2G -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M -Duser.timezone=GMT" 

注:SBT必须是最新的版本

旧版本的sbt包含覆盖这些设置的错误,使用brew upgrade sbt sbt for Mac的最新sbt (假设brew安装)(IDK for Linux)。 https://github.com/sbt/sbt/issues/2945#issuecomment-277490848

截至2015年3月,如果您在OSX上使用sbt和Homebrew,那么您应该编辑文件/usr/local/etc/sbtopts

例如

 # set memory options # #-mem <integer> -mem 2048 

“sbt -mem 23000 run”适合我。

我find了解决办法。 不pipe你如何指定JVM堆大小,它将永远不会工作,因为SBT可执行文件已经覆盖它。

SBT可执行文件中有一行说:

. /usr/share/sbt/sbt-launch-lib.bash

所以我编辑了这个文件:

  # run sbt execRunner "$java_cmd" \ ${SBT_OPTS:-$default_sbt_opts} \ - $(get_mem_opts $sbt_mem) \ ${java_opts} \ ${java_args[@]} \ -jar "$sbt_jar" \ "${sbt_commands[@]}" \ "${residual_args[@]}" 

删除-线。

现在,当您运行SBT时,它将不再覆盖您的JVM堆大小设置。 您可以使用@ Noan的答案指定堆大小设置。

或者:

sbt -J-Xmx4G -J-Xms4G

在Windows上,对于sbt 0.13.9.2,您需要将JAVA_OPTS设置为您想要的jvm选项。

 > set JAVA_OPTS=-Xmx1G > sbt assembly 

sbt.bat脚本将它的默认值从conf\sbtconfig.txtCFG_OPTS但是如果设置,将使用JAVA_OPTS

有关sbt.bat摘录:

 rem FIRST we load the config file of extra options. set FN=%SBT_HOME%\..\conf\sbtconfig.txt set CFG_OPTS= FOR /F "tokens=* eol=# usebackq delims=" %%i IN ("%FN%") DO ( set DO_NOT_REUSE_ME=%%i rem ZOMG (Part #2) WE use !! here to delay the expansion of rem CFG_OPTS, otherwise it remains "" for this loop. set CFG_OPTS=!CFG_OPTS! !DO_NOT_REUSE_ME! ) 

。 。 。 (跳过)。 。 。

 rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config. set _JAVA_OPTS=%JAVA_OPTS% if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=%CFG_OPTS% :run "%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %* 

我想在Mac OS X上用SBT的自制安装来解决这个问题。 如果你通过自制软件安装了SBT,你可以清楚看到/usr/local/bin/sbt文件

 #!/bin/sh test -f ~/.sbtconfig && . ~/.sbtconfig exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.3/libexec/sbt-launch.jar "$@" 

这意味着您在SBT_OPTS放置的任何设置都将保持SBT_OPTS (您的-Xmx将优先)。 此外,脚本的第一行将执行~/.sbtconfig任何命令(如果存在的话),所以如果您正在玩这些命令,那么放置SBT选项可能会更好。 每当您对SBT_OPTS进行更改时,您都不必inputsource ~/.bash_profile

如果从PowerShell运行sbt,请设置SBT_OPTs环境variables,如下所示:

 $env:SBT_OPTS="-Xms512M -Xmx1024M -Xss2M -XX:MaxMetaspaceSize=1024M" 

然后运行:

 sbt