Как установить размер кучи для SBT?

Я использую SBT 0.12.0. Я прочитал другие ответы о переполнении стека и следовал за ними, однако ни один из них не помогает, например:

  • Создайте ForkRun класс - я не наблюдал никакого разветвленного процесса во время моего использования sbt
  • установить переменную среды JAVA_OPTS - он установлен, но командная строка процесса sbt, похоже, не использует его вообще.
  • sbt -J-Xmx2G добавляет параметр в командную строку процесса sbt, однако старое значение -Xmx1536m используется sbt вместо добавленного параметра.

Я что-то пропустил? Как установить размер кучи для sbt 0.12, когда выполняете тестирование и run?

12 ответов

Решение

Я нашел решение. Независимо от того, как вы указываете размер кучи 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

Тебе нужно 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 для последних sbt для Mac (при условии установки brew) (IDK для Linux). https://github.com/sbt/sbt/issues/2945

По состоянию на март 2015 года, если вы используете sbt в OSX вместе с Homebrew, вам следует отредактировать файл /usr/local/etc/sbtopts

например

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

У меня работает "sbt -mem 23000 run".

Быстрый способ сделать это с .jvmopts файл в корне вашего проекта (из документации Lagom Framework):

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

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

Я пытался решить проблему, подобную этой, в Mac OS X с помощью доморощенной установки SBT. Если вы установили SBT с помощью homebrew, вы /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

Если вы запускаете sbt из PowerShell, установите SBT_OPTs переменная окружения, вот так:

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

Затем запустите:

sbt

Для SBT версии 1.0.4 в Windows настройки JVM по умолчанию берутся изsbt\conf\sbtconfig.txt файл. Просто измените значения здесь. + Изменить -Xmx512M в -Xmx2048M,

Это не единственный источник параметров JVM для SBT. Другие могут быть найдены путем проверки sbt.bat, Простой способ выяснить, откуда берутся настройки, - закомментировать эту строку в командном файле: @echo off,

В моем случае конфигурация моей службы перезаписывала переменную среды 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

На окнах работает SET SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xmx2G -Xms1G"до sbtкажется, это то, что решило это для меня.

Ссылка: https://www.baeldung.com/scala/sbt-heap-size

я только что изменил exportк SET.

Если вы используете Windows, вы можете легко установить переменные среды:

После этого не забудьте перезапустить консоль терминала (CMD, Powershell,...) для обновления.

Это работает для меня!

Другие вопросы по тегам