如何为sbt设置堆大小?

时间:2013-03-07 20:13:26

标签: scala sbt

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

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

我错过了什么吗?在进行测试和run

时,如何为sbt 0.12设置堆大小

10 个答案:

答案 0 :(得分:89)

您需要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包含覆盖这些设置的错误,请使用brew upgrade sbt代表Mac的最新sbt(假设brew安装)(适用于Linux的IDK)。 https://github.com/sbt/sbt/issues/2945#issuecomment-277490848

答案 1 :(得分:59)

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

e.g。

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

答案 2 :(得分:40)

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

答案 3 :(得分: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[@]}"

删除-行。

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

或者:

sbt -J-Xmx4G -J-Xms4G

答案 4 :(得分: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

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

答案 5 :(得分: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

答案 6 :(得分:5)

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

SBT_OPTs

然后运行:

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

答案 7 :(得分:4)

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

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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