如何为sbt设置堆大小?

83 scala sbt

我使用的是SBT 0.12.0.我已经阅读了有关堆栈溢出的其他答案并遵循它们,但是它们都没有帮助,例如:

  • 创建ForkRun类 - 在使用sbt期间,我没有观察到任何分叉进程
  • 设置环境变量JAVA_OPTS- 它已设置但是sbt的进程命令行似乎根本不使用它.
  • sbt -J-Xmx2G将参数附加到sbt进程命令行,但旧值-Xmx1536m由sbt而不是附加参数使用.

我错过了什么吗?在进行两种测试时,如何设置sbt 0.12的堆大小run

Noa*_*oah 94

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

export SBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M  -Duser.timezone=GMT"
Run Code Online (Sandbox Code Playgroud)

更新: 要获得2G堆空间,您可以使用:

export SBT_OPTS="-Xmx2G -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M  -Duser.timezone=GMT"
Run Code Online (Sandbox Code Playgroud)

注意:SBT必须是最新版本

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

  • 是的,你需要使用-Xmx2G,我更新了SBT_OPTS (2认同)
  • 我收到警告:`Java HotSpot(TM)64位服务器VM警告:忽略选项MaxPermSize = 4G; 在8.0`中删除了支持 (2认同)
  • @samthebest Perm Gen 基本上在 Java 8 中被删除了,所以没有必要包含它。 (2认同)

Syn*_*sso 61

自2015年3月,如果你正在使用SBT OSX自制,那么你应该编辑文件/usr/local/etc/sbtopts

例如

# set memory options
#
#-mem   <integer>
-mem 2048
Run Code Online (Sandbox Code Playgroud)

  • 这似乎也适用于Windows,而不必乱用env变量(该文件在c:\ program files\sbt\confs下). (4认同)
  • 在Linux中,它位于`/ etc/sbt-launcher-packaging`中. (2认同)

GBY*_*GBY 40

"sbt -mem 23000 run"对我有用.

  • 多数民众赞成23Gb不是..? (5认同)
  • @BenHutchison 这可能是 paulp 的 sbt 包装器,而不是原始的 sbt 是吗 (2认同)

小智 20

我找到了解决方案.无论您如何指定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[@]}"
Run Code Online (Sandbox Code Playgroud)

删除该-行.

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

或者:

sbt -J-Xmx4G -J-Xms4G

  • 实际上,似乎'〜/ .sbtconfig`中的`export SBT_OPTS ="..."`确实有效. (3认同)

Cho*_*hoy 15

在Windows上,对于sbt 0.13.9.2,您需要设置JAVA_OPTS所需的jvm选项.

> set JAVA_OPTS=-Xmx1G
> sbt assembly
Run Code Online (Sandbox Code Playgroud)

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!
)
Run Code Online (Sandbox Code Playgroud)

...(跳过)...

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 %*
Run Code Online (Sandbox Code Playgroud)


Adr*_*uez 11

我想在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 "$@"
Run Code Online (Sandbox Code Playgroud)

这意味着您输入的任何设置SBT_OPTS都会粘住(您的-Xmx将优先).此外,~/.sbtconfig如果脚本存在,脚本的第一行将执行任何命令,因此如果您正在使用它们,它可能是放置SBT选项的更好位置.您不必source ~/.bash_profile每次都进行更改SBT_OPTS

  • 是.这是我在$ HOME/.sbtconfig中的内容.导出SBT_OPTS =" - XX:MaxPermSize = 512M -Xmx2G -Xms64M",当我启动sbt时,我执行ps aux并显示/ usr/bin/java -Xmx512M -XX:MaxPermSize = 512M -Xmx2G -Xms64M -jar/USR /本地/库/ SBT/0.13.0/libexec目录/ SBT-launch.jar (2认同)
  • Homebrew SBT现在要求在`/ usr/local/etc/sbtopts中使用`-mem`参数配置堆大小. (2认同)

sun*_*ant 6

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

$env:SBT_OPTS="-Xms512M -Xmx1024M -Xss2M -XX:MaxMetaspaceSize=1024M"
Run Code Online (Sandbox Code Playgroud)

然后运行:

sbt
Run Code Online (Sandbox Code Playgroud)


mik*_*ike 6

一种快速的方法是使用.jvmopts项目根目录中的文件(来自Lagom 框架文档):

 $ cat .jvmopts
 -Xms512M
 -Xmx4096M
 -Xss2M
 -XX:MaxMetaspaceSize=1024M
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为正确答案,因为它还允许每个项目设置。 (4认同)

Jar*_*zek 5

对于Windows上的SBT 1.0.4版,默认JVM设置来自sbt\conf\sbtconfig.txt文件。只需在此处编辑值。更改-Xmx512M-Xmx2048M

这不是SBT的JVM选项的唯一来源。通过检查可以找到其他人sbt.bat。一种简单的诊断方法(设置来自何处)是通过在批处理文件中将此行注释掉@echo off