Як встановити розмір купи для sbt?


90

Я використовую SBT 0.12.0. Я прочитав інші відповіді щодо переповнення стека і слідував за ними, проте жодна з них не допомагає, наприклад:

  • create ForkRunclass - я не спостерігав жодного розгалуженого процесу під час використання sbt
  • set змінної середовища JAVA_OPTS- вона встановлена, але командний рядок процесу sbt, схоже, не використовує її взагалі.
  • sbt -J-Xmx2Gдодає параметр до командного рядка процесу sbt, однак старе значення -Xmx1536mвикористовується sbt замість доданого параметра.

Мені чогось не вистачає? Як встановити розмір купи для sbt 0,12, виконуючи як тестування, так і run?


9
Ви пробували memпараметр під час запуску sbt? (напр. sbt -mem2000)
ом-ном-ном

2
У вас може бути друкарська помилка, це має бути JAVA_OPTS, а не JAVA_OPS
Ной

Перевірте мою відповідь на дублікат цього запитання. stackoverflow.com/questions/3868863/... позначена відповідь там неправильна, але моя працює (іноді вам теж потрібно перевірити коментарі / голоси :)
iwein

Відповіді:


101

Вам потрібно 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 process, як очікувалося, однак старий -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

1
@samthebest Perm Gen був в основному видалений в Java 8, тому не потрібно включати це.
Ной

65

Станом на березень 2015 року, якщо ви використовуєте sbt на OSX із Homebrew, вам слід відредагувати файл/usr/local/etc/sbtopts

напр

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

5
Здається, це також добре працює для вікон, замість того, щоб возитися зі змінними env (файл знаходиться у каталозі c: \ program files \ sbt \ confs).
Luciano

2
У Linux це в /etc/sbt-launcher-packaging.
Робін Грін,

1
В Ubuntu Artful я знайшов його в/etc/sbt/sbtopts
Synesso

Це рішення змусить JVM попередньо розподілити всю пам’ять 2 Гб. Якщо ви використовуєте SBT_OPTS=-Xmx2G sbtдля запуску SBT, він збільшить купу при необхідності максимум до 2 ГБ.
mgd

Подивіться на @ Mike сек рішення вище: stackoverflow.com/a/55706960/1199564
MGD

42

"sbt -mem 23000 run" працює для мене.


6
це 23 Гб чи не ..?
Ben Hutchison

1
@BenHutchison це, мабуть, обгортка sbt від paulp, а не оригінальна sbt - це
matanster

19

Я знайшов рішення. Незалежно від того, як ви вкажете розмір купи 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="..."in ~/.sbtconfigсправді працює.
Ерік Каплун,

15

У вікнах для 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 за допомогою домашньої мови, ви не в стані, оскільки /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. експортувати 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параметром in/usr/local/etc/sbtopts
Synesso 16.03.15

6

Якщо запущено sbt з PowerShell, встановіть SBT_OPTsзмінну середовища приблизно так:

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

Потім запустіть:

sbt

6

Для версії SBT 1.0.4 для Windows налаштування JVMsbt\conf\sbtconfig.txt за замовчуванням надходять із файлу. Просто відредагуйте значення тут. Змінити -Xmx512Mна -Xmx2048M.

Це не єдине джерело варіантів JVM для SBT. Інших можна знайти, оглянувши sbt.bat. Простий спосіб діагностики, де робити настройки беруться, це, коментуючи цей рядок в пакетному файлі: @echo off.


Примітка: це sbt\confрозміщується не в каталозі користувача, а в папці Program Files, наприклад C:\Program Files (x86)\sbt\conf.
Сума,

5

Швидкий спосіб зробити це за допомогою .jvmoptsфайлу в кореневій частині вашого проекту (з документації Lagom Framework ):

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

1
Це має бути позначено як правильна відповідь, оскільки це також дозволяє відповідно до налаштувань проекту.
mgd

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.