Jak ustawić rozmiar sterty dla sbt?

90

Używam SBT 0.12.0. Przeczytałem inne odpowiedzi na temat przepełnienia stosu i podążałem za nimi, jednak żadna z nich nie pomaga, na przykład:

  • create ForkRunclass - nie zauważyłem żadnego rozwidlonego procesu podczas korzystania z sbt
  • ustaw zmienną środowiskową JAVA_OPTS- jest ustawiona, ale wiersz poleceń procesu sbt w ogóle jej nie używa.
  • sbt -J-Xmx2Gdołącza parametr do wiersza poleceń procesu sbt, jednak -Xmx1536msbt używa starej wartości zamiast dołączonego parametru.

Czy coś mi brakuje? Jak ustawić rozmiar sterty dla sbt 0.12 podczas wykonywania testów i run?

spydon
źródło
9
Czy próbowałeś memparametru podczas uruchamiania sbt? (np. sbt -mem2000)
om-nom-nom
2
Możesz mieć literówkę, powinna to być JAVA_OPTS, a nie JAVA_OPS
Noah
Sprawdź moją odpowiedź na duplikat tego pytania. stackoverflow.com/questions/3868863/ ... zaznaczona odpowiedź jest zła, ale moja działa (czasami trzeba też sprawdzić komentarze / głosy :)
iwein

Odpowiedzi:

101

Potrzebujesz SBT_OPTS, oto czego używam w moim .bash_profile :

export SBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M  -Duser.timezone=GMT"

AKTUALIZACJA: Aby uzyskać miejsce na stertę 2G, możesz użyć tego:

export SBT_OPTS="-Xmx2G -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M  -Duser.timezone=GMT"

UWAGA: SBT MUSI BYĆ NAJNOWSZA WERSJA

Starsze wersje sbtzawierają błędy, które zastępują te ustawienia, użyj brew upgrade sbtdla najnowszych wersji sbtdla komputerów Mac (zakładając instalację brew) (IDK dla systemu Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848

Noe
źródło
1
Dziękuję Ci. Rzeczywiście zmienia wiersz poleceń procesu sbt zgodnie z oczekiwaniami, jednak stary -Xmx1546mnadal istnieje w wierszu poleceń, a maksymalny rozmiar sterty jest nadal ograniczony do 1,5 GB, jak pokazano w visualvm.
1
jakikolwiek sposób, aby ustawić to ustawienie środowiska w konfiguracji SBT, która jest kontrolowana przez źródło?
Kevin Meredith
Spójrz na źródła scalaz, mają plik bash o nazwie sbt, który ładuje wszystko, czego potrzebują, czyli jest specyficzny dla środowiska github.com/scalaz/scalaz/blob/series/7.2.x/sbt
Noah
4
Dostaję ostrzeżenie:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
samthebest
1
@samthebest Perm Gen został zasadniczo usunięty w Javie 8, więc nie jest konieczne dołączanie tego.
Noah
66

Od marca 2015 r., Jeśli używasz sbt na OSX z Homebrew , powinieneś edytować plik/usr/local/etc/sbtopts

na przykład

# set memory options
#
#-mem   <integer>
-mem 2048
Synesso
źródło
5
Wydaje się, że działa to również dobrze w systemie Windows, zamiast bawić się zmiennymi env (plik znajduje się w folderze c: \ program files \ sbt \ confs).
Luciano,
2
W Linuksie jest w /etc/sbt-launcher-packaging.
Robin Green,
1
W Ubuntu Artful znalazłem to w/etc/sbt/sbtopts
Synesso
To rozwiązanie spowoduje, że maszyna JVM wstępnie przydzieli całą 2 GB pamięci. Jeśli użyjesz SBT_OPTS=-Xmx2G sbtdo uruchomienia SBT, w razie potrzeby sterta powiększy się do maksymalnie 2 GB.
mgd
Spójrz na powyższe rozwiązanie @mike s: stackoverflow.com/a/55706960/1199564
mgd
42

U mnie działa „sbt -mem 23000 run”.

GBY
źródło
6
to 23 GB, prawda?
Ben Hutchison
1
@BenHutchison to prawdopodobnie opakowanie sbt Paulpa, a nie oryginalne sbt, czy to jest
matanster
19

Znalazłem rozwiązanie. Bez względu na to, jak określisz rozmiar sterty maszyny JVM, to nigdy nie zadziała, ponieważ plik wykonywalny SBT już go przesłonił.

W pliku wykonywalnym SBT znajduje się wiersz, który mówi:

. /usr/share/sbt/sbt-launch-lib.bash

Więc zredagowałem plik:

  # 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[@]}"

Usuń -linię.

Teraz po uruchomieniu SBT nie będzie już zastępować ustawień rozmiaru sterty maszyny JVM. Możesz określić ustawienia rozmiaru sterty, używając odpowiedzi @ Noan.

Lub alternatywnie:

sbt -J-Xmx4G -J-Xms4G


źródło
3
Właściwie wydaje się, że export SBT_OPTS="..."w ~/.sbtconfigrzeczywiście działa.
Erik Kaplun
15

W systemie Windows dla sbt 0.13.9.2 musisz ustawić żądane opcje jvm JAVA_OPTS.

> set JAVA_OPTS=-Xmx1G
> sbt assembly

sbt.batSkrypt ładuje swoje domyślne od conf\sbtconfig.txtdo CFG_OPTS, ale użyje JAVA_OPTSzamiast jeśli zestaw.

Odpowiednie fragmenty z 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!
)

. . . (pominąć) . . .

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 %*
choy
źródło
11

Szukałem rozwiązania takiego problemu w systemie Mac OS X za pomocą domowej instalacji SBT. Jeśli zainstalowałeś SBT przez homebrew, wszystko jest jasne, ponieważ /usr/local/bin/sbtplik wygląda jak

#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.3/libexec/sbt-launch.jar "$@"

Oznacza to, że wszelkie wprowadzone ustawienia SBT_OPTSzostaną zachowane (pierwszeństwo będzie mieć twój -Xmx). Co więcej, pierwsza linia skryptu wykona wszelkie polecenia, ~/.sbtconfigjeśli istnieją, więc może być lepszym miejscem do umieszczenia opcji SBT, jeśli dużo się nimi bawisz. Nie będziesz musiał tego robić za source ~/.bash_profilekażdym razem, gdy dokonasz zmianySBT_OPTS

Adrian Rodriguez
źródło
2
tak. To jest to, co mam w $ HOME / .sbtconfig. export SBT_OPTS = "- XX: MaxPermSize = 512M -Xmx2G -Xms64M" a kiedy uruchamiam sbt, robię ps aux i wyświetla / usr / bin / java -Xmx512M -XX: MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / sbt / 0.13.0 / libexec / sbt-launch.jar
Adrian Rodriguez
Jednak właśnie zobaczyłem odpowiedź poniżej i być może ten program uruchamiający jest przeznaczony do innego typu konfiguracji. Moja konfiguracja jest specyficzna dla komputerów Mac korzystających z pakietu homebrew.
Adrian Rodriguez
2
Homebrew SBT wymaga teraz skonfigurowania rozmiaru sterty za pomocą -memparametru w/usr/local/etc/sbtopts
Synesso
6

Jeśli uruchamiasz sbt z PowerShell, ustaw SBT_OPTszmienną środowiskową, na przykład:

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

Następnie uruchomić:

sbt
śpiewny
źródło
6

W przypadku SBT w wersji 1.0.4 w systemie Windows domyślne ustawienia maszyny JVM pochodzą zsbt\conf\sbtconfig.txt pliku. Po prostu edytuj wartości tutaj. Zmień -Xmx512Mna -Xmx2048M.

Nie jest to jedyne źródło opcji JVM dla SBT. Inne można znaleźć, sprawdzając sbt.bat. Prostym sposobem, aby zdiagnozować, skąd ustawienia pochodzę, jest komentując tę linię w pliku wsadowym: @echo off.

Jarekczek
źródło
Uwaga: to nie sbt\confjest umieszczone w katalogu użytkownika, ale w folderze Program Files, na przykład C:\Program Files (x86)\sbt\conf.
Suma
5

Szybkim sposobem na zrobienie tego jest .jvmoptsplik w katalogu głównym projektu (z dokumentacji Lagom Framework ):

 $ cat .jvmopts
 -Xms512M
 -Xmx4096M
 -Xss2M
 -XX:MaxMetaspaceSize=1024M
mikrofon
źródło
1
Powinna być oznaczona jako prawidłowa odpowiedź, ponieważ zezwala również na ustawienia projektu.
mgd