如何设置SBT的堆大小?


89

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

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

我想念什么吗?在同时进行测试和时,如何设置sbt 0.12的堆大小run


8
mem启动sbt时是否尝试过参数?(例如sbt -mem2000
om-nom-nom

2
您可能有错字,应该是JAVA_OPTS而不是JAVA_OPS
Noah

查看我对这个问题重复的答案。stackoverflow.com/questions/3868863/…标记的答案有误,但是我的工作正常(有时您也需要检查评论/投票:)
iwein

Answers:


101

您需要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


1
谢谢。实际上,它确实按预期更改了sbt process命令行,但是命令行中-Xmx1546m仍然存在旧命令,并且最大堆大小仍限制为1.5 GB,如visualvm中所示。

1
有什么方法可以在源代码控制的SBT配置中设置此环境设置?
凯文·梅雷迪斯

看一下scalaz的源代码,他们有一个名为sbt的bash文件,可以加载所需的所有内容,也就是特定
Noah

4
我收到警告:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
最棒的

1
@samthebest Perm Gen在Java 8中已基本删除,因此没有必要将其包括在内。
挪亚

65

自2015年3月起,如果您在OSX上使用Homebrew使用sbt,则应编辑该文件/usr/local/etc/sbtopts

例如

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

5
这似乎也适用于Windows,而不必弄乱env变量(该文件位于c:\ program files \ sbt \ confs下)。
Luciano

2
在Linux中,它位于/etc/sbt-launcher-packaging
罗宾·格林

1
在Ubuntu Artful中,我在/etc/sbt/sbtopts
Synesso '18

该解决方案将使JVM预分配所有2GB内存。如果SBT_OPTS=-Xmx2G sbt用于启动SBT,它将根据需要将堆增长到最大2GB。
mgd

看看上面的@mike解决方案:stackoverflow.com/a/55706960/1199564
mgd

42

“ sbt -mem 23000 run”对我有用。


6
多数民众赞成在23Gb是不是..?
本·哈奇森

1
@BenHutchison这可能是paulp的sbt包装器,不是原始的sbt
Matanster

19

我找到了解决方案。无论您如何指定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


3
实际上看来export SBT_OPTS="..."in~/.sbtconfig确实确实有效。
埃里克·卡普伦2014年

15

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

> set JAVA_OPTS=-Xmx1G
> sbt assembly

sbt.bat脚本将默认值从加载conf\sbtconfig.txt到,CFG_OPTSJAVA_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 %*

11

我一直在寻找通过自制安装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


2
是。这就是我在$ HOME / .sbtconfig中所拥有的。导出SBT_OPTS =“-XX:MaxPermSize = 512M -Xmx2G -Xms64M”,当我启动sbt时,我执行ps aux并显示/ usr / bin / java -Xmx512M -XX:MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / sbt / 0.13.0 / libexec / sbt-launch.jar
Adrian Rodriguez

但是,我只是在下面看到了答案,也许启动器是用于另一种设置的。我的设置特定于使用自制程序包的Mac。
Adrian Rodriguez

2
自制SBT现在要求使用-mem/usr/local/etc/sbtopts
Synesso

6

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

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

然后运行:

sbt

6

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

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


注意:该文件sbt\conf不在用户目录中,而是在Program Files文件夹中,例如C:\Program Files (x86)\sbt\conf
Suma,

5

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

 $ cat .jvmopts
 -Xms512M
 -Xmx4096M
 -Xss2M
 -XX:MaxMetaspaceSize=1024M

1
应该将其标记为正确答案,因为它也允许每个项目设置。
MGD

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.