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
ForkRun
class - 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-Xmx2G
dołącza parametr do wiersza poleceń procesu sbt, jednak-Xmx1536m
sbt 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
?
mem
parametru podczas uruchamiania sbt? (np.sbt -mem2000
)Odpowiedzi:
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
sbt
zawierają błędy, które zastępują te ustawienia, użyjbrew upgrade sbt
dla najnowszych wersjisbt
dla komputerów Mac (zakładając instalację brew) (IDK dla systemu Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848źródło
-Xmx1546m
nadal istnieje w wierszu poleceń, a maksymalny rozmiar sterty jest nadal ograniczony do 1,5 GB, jak pokazano w visualvm.Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
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
źródło
/etc/sbt-launcher-packaging
./etc/sbt/sbtopts
SBT_OPTS=-Xmx2G sbt
do uruchomienia SBT, w razie potrzeby sterta powiększy się do maksymalnie 2 GB.U mnie działa „sbt -mem 23000 run”.
źródło
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
export SBT_OPTS="..."
w~/.sbtconfig
rzeczywiście działa.W systemie Windows dla sbt 0.13.9.2 musisz ustawić żądane opcje jvm
JAVA_OPTS
.> set JAVA_OPTS=-Xmx1G > sbt assembly
sbt.bat
Skrypt ładuje swoje domyślne odconf\sbtconfig.txt
doCFG_OPTS
, ale użyjeJAVA_OPTS
zamiast 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 %*
źródło
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/sbt
plik 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_OPTS
zostaną zachowane (pierwszeństwo będzie mieć twój -Xmx). Co więcej, pierwsza linia skryptu wykona wszelkie polecenia,~/.sbtconfig
jeś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ć zasource ~/.bash_profile
każdym razem, gdy dokonasz zmianySBT_OPTS
źródło
-mem
parametru w/usr/local/etc/sbtopts
Jeśli uruchamiasz sbt z PowerShell, ustaw
SBT_OPTs
zmienną środowiskową, na przykład:$env:SBT_OPTS="-Xms512M -Xmx1024M -Xss2M -XX:MaxMetaspaceSize=1024M"
Następnie uruchomić:
źródło
W przypadku SBT w wersji 1.0.4 w systemie Windows domyślne ustawienia maszyny JVM pochodzą z
sbt\conf\sbtconfig.txt
pliku. Po prostu edytuj wartości tutaj. Zmień-Xmx512M
na-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
.źródło
sbt\conf
jest umieszczone w katalogu użytkownika, ale w folderze Program Files, na przykładC:\Program Files (x86)\sbt\conf
.Szybkim sposobem na zrobienie tego jest
.jvmopts
plik w katalogu głównym projektu (z dokumentacji Lagom Framework ):$ cat .jvmopts -Xms512M -Xmx4096M -Xss2M -XX:MaxMetaspaceSize=1024M
źródło
W moim przypadku konfiguracja mojej usługi nadpisała zmienną środowiskową
SBT_OPTS
iJAVA_OPTS
. Mogłem ustawić limity, ustawiając w moimbuild.sbt
:javaOptions in Universal ++= Seq( "-J-Xms1g", "-J-Xmx2g")
Źródła: https://www.scala-sbt.org/sbt-native-packager/archetypes/java_app/customize.html
źródło