94

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

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

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

4

11 回答 11

104

您需要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包含覆盖这些设置的错误,用于 Macbrew upgrade sbt的最新sbt版本(假设 brew install)(Linux 的 IDK)。https://github.com/sbt/sbt/issues/2945#issuecomment-277490848

于 2013-03-07T20:55:58.467 回答
71

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

例如

# set memory options
#
#-mem   <integer>
-mem 2048
于 2015-03-16T00:44:44.150 回答
44

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

于 2014-01-02T20:16:17.573 回答
21

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

于 2013-03-07T23:53:53.407 回答
15

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

> set JAVA_OPTS=-Xmx1G
> sbt assembly

sbt.bat脚本从conf\sbtconfig.txtinto加载其默认值,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 %*
于 2016-01-20T15:53:30.383 回答
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 "$@"

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

于 2013-07-02T23:00:22.147 回答
8

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

 $ cat .jvmopts
 -Xms512M
 -Xmx4096M
 -Xss2M
 -XX:MaxMetaspaceSize=1024M
于 2019-04-16T11:19:30.787 回答
7

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

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

然后运行:

sbt
于 2017-08-16T11:53:33.447 回答
6

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

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

于 2017-12-03T18:04:31.373 回答
1

就我而言,我的服务配置覆盖了环境变量SBT_OPTSJAVA_OPTS. 我可以通过设置build.sbt以下内容来设置限制:

javaOptions in Universal ++= Seq(
  "-J-Xms1g",
  "-J-Xmx2g")

参考:https ://www.scala-sbt.org/sbt-native-packager/archetypes/java_app/customize.html

于 2019-06-13T19:47:52.683 回答
0

在 Windows 上,SET SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xmx2G -Xms1G"之前运行sbt似乎是为我解决的问题。

参考:https ://www.baeldung.com/scala/sbt-heap-size

我刚改成export.SET

于 2021-11-24T19:09:06.547 回答