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

92

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

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

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

Spydon
источник
9
Вы пробовали memпараметр при запуске sbt? (eg sbt -mem2000)
om-nom-nom
2
У вас может быть опечатка, это должно быть JAVA_OPTS, а не JAVA_OPS
Ной
Посмотрите мой ответ на дубликат этого вопроса. stackoverflow.com/questions/3868863/… отмеченный ответ неверен, но мой работает (иногда вам также нужно проверять комментарии / голоса :)
iwein

Ответы:

102

Вам нужно 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#issuecomment-277490848

Ной
источник
1
Спасибо. Это действительно изменяет командную строку процесса sbt, как и ожидалось, однако старая -Xmx1546mвсе еще существует в командной строке, и максимальный размер кучи по-прежнему ограничен 1,5 ГБ, как показано в visualvm.
1
каким-либо способом установить этот параметр среды в конфигурации SBT, управляемой источником?
Кевин Мередит
Взгляните на исходный код scalaz, у них есть bash-файл с именем sbt, который загружает все, что им нужно, иначе говоря, зависит от среды github.com/scalaz/scalaz/blob/series/7.2.x/sbt
Ной
4
Я получаю предупреждение:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
samthebest 04
1
@samthebest Perm Gen в основном был удален в Java 8, поэтому включать его не обязательно.
Ной
66

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

например

# set memory options
#
#-mem   <integer>
-mem 2048
Synesso
источник
5
Кажется, это также хорошо работает для Windows, вместо того, чтобы возиться с переменными env (файл находится в папке c: \ program files \ sbt \ confs).
Лучано
2
В Linux это /etc/sbt-launcher-packaging.
Робин Грин
1
В Ubuntu хитрые, я нашел его в/etc/sbt/sbtopts
Synesso
Это решение заставит JVM предварительно выделить все 2 ГБ памяти. Если вы используете SBT_OPTS=-Xmx2G sbtдля запуска SBT, он будет увеличивать кучу по мере необходимости до максимум 2 ГБ.
mgd
Взгляните на решение @mike выше: stackoverflow.com/a/55706960/1199564
mgd
43

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

GBY
источник
6
это 23Gb не так ли ..?
Бен Хатчисон,
1
@BenHutchison, это, вероятно, оболочка sbt paulp, а не оригинальная sbt
matanster
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


источник
3
На самом деле, кажется , что export SBT_OPTS="..."в ~/.sbtconfigдействительно работает на самом деле.
Erik Kaplun
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 %*
чой
источник
11

Я искал решение такой проблемы в 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

Адриан Родригес
источник
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
Адриан Родригес
Однако я только что увидел ответ ниже, и, возможно, этот модуль запуска предназначен для другого типа настройки. Моя установка специфична для Mac с использованием пакета homebrew.
Адриан Родригес,
2
Homebrew SBT теперь требует, чтобы размер кучи был настроен с помощью -memпараметра в/usr/local/etc/sbtopts
Synesso
6

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

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

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

sbt
солнечный
источник
6

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

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

Ярекчек
источник
Примечание: это sbt\confпомещается не в каталог пользователя, а в папку Program Files, например C:\Program Files (x86)\sbt\conf.
Suma
6

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

 $ cat .jvmopts
 -Xms512M
 -Xmx4096M
 -Xss2M
 -XX:MaxMetaspaceSize=1024M
Майк
источник
1
Этот ответ должен быть помечен как правильный, поскольку он также допускает настройки проекта.
MGD