我正在使用SBT 0.12.0。我已经阅读了关于堆栈溢出的其他答案并关注它们,但是它们都没有帮助,例如:
- 创建
ForkRun
类-使用sbt期间我没有观察到任何分叉的过程 - 设置环境变量
JAVA_OPTS
-已设置,但sbt的进程命令行似乎根本没有使用它。 sbt -J-Xmx2G
将参数附加到sbt进程命令行,但是-Xmx1536m
sbt使用旧值代替附加的参数。
我想念什么吗?在同时进行测试和时,如何设置sbt 0.12的堆大小run
?
我正在使用SBT 0.12.0。我已经阅读了关于堆栈溢出的其他答案并关注它们,但是它们都没有帮助,例如:
ForkRun
类-使用sbt期间我没有观察到任何分叉的过程JAVA_OPTS
-已设置,但sbt的进程命令行似乎根本没有使用它。sbt -J-Xmx2G
将参数附加到sbt进程命令行,但是-Xmx1536m
sbt使用旧值代替附加的参数。我想念什么吗?在同时进行测试和时,如何设置sbt 0.12的堆大小run
?
Answers:
您需要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
包含较旧版本的bug会覆盖这些设置,对于Mac(假设Brew安装)使用brew upgrade sbt
最新sbt
版本(对于Linux为IDK)使用。https://github.com/sbt/sbt/issues/2945#issuecomment-277490848
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
自2015年3月起,如果您在OSX上使用Homebrew使用sbt,则应编辑该文件/usr/local/etc/sbtopts
例如
# set memory options
#
#-mem <integer>
-mem 2048
/etc/sbt-launcher-packaging
。
/etc/sbt/sbtopts
SBT_OPTS=-Xmx2G sbt
用于启动SBT,它将根据需要将堆增长到最大2GB。
我找到了解决方案。无论您如何指定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
export SBT_OPTS="..."
in~/.sbtconfig
确实确实有效。
在Windows上,对于sbt 0.13.9.2,您需要设置JAVA_OPTS
为所需的jvm选项。
> set JAVA_OPTS=-Xmx1G
> sbt assembly
该sbt.bat
脚本将默认值从加载conf\sbtconfig.txt
到,CFG_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 %*
我一直在寻找通过自制安装SBT在Mac OS X上解决此类问题的方法。如果您是通过自制软件安装的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
都会保留(您的-Xmx将优先)。此外,脚本的第一行将在~/.sbtconfig
其中存在命令时执行所有命令,因此,如果您经常使用它们,可能是放置SBT选项的更好位置。您不必source ~/.bash_profile
每次都更改SBT_OPTS
-mem
/usr/local/etc/sbtopts
一种快速的方法是.jvmopts
在项目根目录中使用一个文件(来自Lagom Framework文档):
$ cat .jvmopts
-Xms512M
-Xmx4096M
-Xss2M
-XX:MaxMetaspaceSize=1024M
就我而言,我的服务配置覆盖了环境变量SBT_OPTS
和JAVA_OPTS
。我可以通过设置build.sbt
以下内容来设置限制:
javaOptions in Universal ++= Seq(
"-J-Xms1g",
"-J-Xmx2g")
参考:https : //www.scala-sbt.org/sbt-native-packager/archetypes/java_app/customize.html
mem
启动sbt时是否尝试过参数?(例如sbt -mem2000
)