如何为sbt设置堆大小?

100

我正在使用SBT 0.12.0版本,我已经阅读了stackoverflow上其他答案并按照它们的方法操作,然而它们都没有帮助我,例如:

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

我是不是漏掉了什么?在进行测试和run时,如何设置sbt 0.12的堆大小?


12
你尝试过在启动sbt时使用mem参数吗?(例如sbt -mem2000 - om-nom-nom
2
你可能打错了,应该是JAVA_OPTS而不是JAVA_OPS。 - Noah
请查看我对此问题的重复回答。https://dev59.com/Rm865IYBdhLWcg3wU9CI#14561346 那里标记的答案是错误的,但我的答案是正确的(有时您需要检查评论/投票 :))。 - iwein
12个回答

109

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

你需要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的旧版本存在覆盖这些设置的漏洞,Mac用户可以使用brew upgrade sbt获取最新版本的sbt(假设已安装brew),Linux用户不确定。参见https://github.com/sbt/sbt/issues/2945#issuecomment-277490848


1
谢谢。它确实按预期更改了sbt进程命令行,但旧的“-Xmx1546m”仍然存在于命令行中,并且最大堆大小仍然被限制在1.5 GB,如visualvm所示。 - user972946
1
有没有办法在受源代码控制的SBT配置中设置此环境变量? - Kevin Meredith
4
我收到一个警告信息:Java HotSpot(TM)64位服务器VM警告: 忽略MaxPermSize=4G选项; 该选项已于8.0中删除。 - samthebest
2
@samthebest Perm Gen 在 Java 8 中基本上被移除了,因此不必包含它。 - Noah
这是我在个人资料中使用的设置,无论物理位置如何,我们都以GMT时间运行所有内容。 - Noah
显示剩余3条评论

74

截至2015年3月,如果你在OSX上使用Homebrew的sbt,则应编辑文件/usr/local/etc/sbtopts

例如:

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

6
这似乎也适用于Windows,而无需在环境变量中搞来搞去(文件位于c:\program files\sbt\confs下)。 - Luciano
2
在Linux中,它位于/etc/sbt-launcher-packaging - Robin Green
1
在Ubuntu Artful中,我发现它在/etc/sbt/sbtopts中。 - Synesso
1
这个解决方案将使JVM预分配所有2GB内存。如果您使用SBT_OPTS=-Xmx2G sbt启动SBT,它将根据需要增加堆大小,最大可达2GB。 - mgd
请查看@mike上面的解决方案:https://dev59.com/PmUp5IYBdhLWcg3wbXNf#55706960 - mgd

47
"

对我来说,'sbt -mem 23000 run' 能正常工作。

"

7
那是23GB,对吗? - Ben Hutchison
2
@BenHutchison 这可能是 paulp 的 sbt 包装器,而不是原始的 sbt。 - matanster

22

我已经找到了解决方案。无论您如何指定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
实际上,在~/.sbtconfig中设置export SBT_OPTS="..."确实是有效的。 - Erik Kaplun
从SBT 0.13.6开始,“.sbtconfig”文件已被弃用。 - Hartmut Pfarr

16
一个快速的方法是在项目的根目录下使用一个.jvmopts文件(来自Lagom框架文档的链接):
 $ cat .jvmopts
 -Xms512M
 -Xmx4096M
 -Xss2M
 -XX:MaxMetaspaceSize=1024M

然后,如果你想检查是否设置正确,请运行sbt -verbose

4
这应该被标记为正确答案,因为它还允许每个项目的设置。 - mgd
确实,这个答案应该被接受,因为它可以与项目一起承担。 - samthebest

15

在Windows上,对于sbt 0.13.9.2版本,您需要设置JAVA_OPTS以获取所需的JVM选项。

> set JAVA_OPTS=-Xmx1G
> sbt assembly

sbt.bat脚本会将默认值从conf\sbtconfig.txt加载到CFG_OPTS中,但如果设置了JAVA_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!
)

. . . (skip) . . .

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

我在 Mac OS X 上使用 Homebrew 安装 SBT,想要解决这样的问题。如果您通过 Homebrew 安装了 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 选项,则将其放在此处可能会更好。每次更改 SBT_OPTS 后,您无需每次运行 source ~/.bash_profile

2
是的。这是我在$HOME/.sbtconfig中的内容。export 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
然而,我刚刚看到下面的答案,也许那个启动器是针对另一种设置的。我的设置是使用Homebrew包针对Mac特定的。 - Adrian Rodriguez
2
Homebrew SBT现在需要使用-mem参数在/usr/local/etc/sbtopts中配置堆大小。 - Synesso

7

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

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

然后运行:

sbt

7
对于SBT 1.0.4版本在Windows上的使用,JVM默认设置来自于sbt\conf\sbtconfig.txt文件。只需编辑此处的值即可。将-Xmx512M更改为-Xmx2048M。
这并不是SBT JVM选项的唯一来源。其他选项可以通过检查sbt.bat文件找到。诊断设置来自哪里的简单方法是在批处理文件中注释掉此行:@echo off。

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

2
在我的情况下,我的服务配置覆盖了环境变量 SBT_OPTSJAVA_OPTS。我可以通过在我的 build.sbt 中设置以下内容来设置限制:
最初的回答: 在我的情况下,我的服务配置会覆盖环境变量 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接