如何为 sbt 设置堆大小?

Posted

技术标签:

【中文标题】如何为 sbt 设置堆大小?【英文标题】:How to set heap size for sbt? 【发布时间】:2013-02-23 05:18:07 【问题描述】:

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

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

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

【问题讨论】:

你在启动sbt的时候试过mem参数吗? (例如sbt -mem2000 您可能有错字,应该是 JAVA_OPTS 而不是 JAVA_OPS 查看我对这个问题副本的回答。 ***.com/questions/3868863/… 标记的答案是错误的,但我的工作(有时你也需要检查 cmets/votes :) 【参考方案1】:

你需要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 是 IDK)。 https://github.com/sbt/sbt/issues/2945#issuecomment-277490848

【讨论】:

谢谢。它确实按预期更改了 sbt 进程命令行,但是旧的-Xmx1546m 仍然存在于命令行中,并且最大堆大小仍然上限为 1.5 GB,如 visualvm 所示。 有什么方法可以在源代码控制的 SBT 配置中设置此环境设置? 看看 scalaz 源代码,他们有一个名为 sbt 的 bash 文件,可以加载他们需要的所有内容,也就是特定于环境的 github.com/scalaz/scalaz/blob/series/7.2.x/sbt 我收到警告:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0 @samthebest Perm Gen 基本上在 Java 8 中被删除了,所以没有必要包含这个。【参考方案2】:

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

例如

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

【讨论】:

这似乎也适用于 Windows,而不必乱用 env 变量(文件位于 c:\program files\sbt\confs 下)。 在 Linux 中它位于 /etc/sbt-launcher-packaging 在 Ubuntu Artful 中,我在/etc/sbt/sbtopts找到了它 这个方案会让JVM预分配所有2GB内存。如果您使用SBT_OPTS=-Xmx2G sbt 启动 SBT,它将根据需要将堆增加到最大 2GB。 看看上面@mike 的解决方案:***.com/a/55706960/1199564【参考方案3】:

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

【讨论】:

那是 23Gb 不是吗..? @BenHutchison 这可能是 paulp 的 sbt 包装器,而不是原来的 sbt 【参考方案4】:

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

【讨论】:

实际上,~/.sbtconfig 中的export SBT_OPTS="..." 似乎确实有效。【参考方案5】:

在 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 %*

【讨论】:

【参考方案6】:

我希望通过自制安装的 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 选项的更好地方。每次对SBT_OPTS 进行更改时,您都不必source ~/.bash_profile

【讨论】:

是的。这就是我在 $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 但是,我刚刚看到下面的答案,也许该启动器用于另一种设置。我的设置是使用 homebrew 包特定于 Mac 的。 Homebrew SBT 现在需要在/usr/local/etc/sbtopts 中使用-mem 参数配置堆大小【参考方案7】:

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

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

【讨论】:

这应该被标记为正确答案,因为它还允许每个项目设置。【参考方案8】:

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

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

然后运行:

sbt

【讨论】:

【参考方案9】:

对于 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【参考方案10】:

就我而言,我的服务配置覆盖了环境变量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

【讨论】:

【参考方案11】:

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

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

我刚刚将export 更改为SET

【讨论】:

以上是关于如何为 sbt 设置堆大小?的主要内容,如果未能解决你的问题,请参考以下文章

在 IntelliJ 中从 sbt 控制台设置 JVM 堆大小

如何为 sbt native packager 的 DockerPlugin 设置基础镜像?

如何增加 sbt 在 Windows 下运行的 JVM 堆大小?

如何为 sbt-native-package 指定 RPM_BUILD_ROOT

如何为使用 sbt native packager 构建的应用程序指定 java.library.path?

如何为 sbt 测试指定 sbt 0.12.2 的配置文件?