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?


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


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

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”.


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


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

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


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

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.


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

1
Powinna być oznaczona jako prawidłowa odpowiedź, ponieważ zezwala również na ustawienia projektu.
— mgd

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.