Jak określić maksymalny rozmiar sterty maszyny JVM „-Xmx” do uruchamiania aplikacji z akcją „uruchom” w SBT?

98

Moja aplikacja przetwarza duże tablice danych i potrzebuje więcej pamięci niż domyślnie zapewnia JVM. Wiem, że w Javie jest to określone opcją „-Xmx”. Jak ustawić SBT tak, aby używał określonej wartości „-Xmx”, aby uruchamiać aplikację z akcją „uruchom”?

Ivan
źródło

Odpowiedzi:

17

Spróbuj tego:

class ForkRun(info: ProjectInfo) extends DefaultProject(info) {
    override def fork = Some(new ForkScalaRun {
        override def runJVMOptions = super.runJVMOptions ++ Seq("-Xmx512m")
        override def scalaJars = Seq(buildLibraryJar.asFile, buildCompilerJar.asFile)
    })
}
Arne
źródło
53
To jest nieaktualne, teraz możesz z niego korzystaćjavaOptions += "-Xmx1G"
iwein
1
@iwein, treść mojego posta wydaje się być dla Ciebie bardzo ważna.
Arne
2
Zauważ, że javaOptionsmają one wpływ tylko na rozwidlone maszyny JVM (patrz scala-sbt.org/0.13/docs/Forking.html )
Yar
1
Dodaj fork in run := ture włączajavaOptions
coanor
@coanor ta odpowiedź dotyczy starożytnej wersji sbt. Poniżej znajduje się odpowiedź o znacznie wyższych rankingach. Ta odpowiedź była poprawną odpowiedzią w momencie zadawania pytania.
Arne
113

W przypadku procesów rozwidlonych należy spojrzeć na Build.scala

Aby zmodyfikować opcje java dla procesów rozwidlonych, musisz określić je w Build.scala (lub jakkolwiek nazwałeś swoją kompilację) w następujący sposób:

val buildSettings = Defaults.defaultSettings ++ Seq(
   //…
   javaOptions += "-Xmx1G",
   //…
)

To da ci odpowiednie opcje bez globalnej modyfikacji JAVA_OPTS i umieści niestandardowe JAVA_OPTS w wygenerowanym skrypcie startowym sbt

W przypadku procesów nierozdzielonych najwygodniej jest ustawić konfigurację za pośrednictwem sbtoptslub w sbtconfigzależności od wersji sbt.

Ponieważ sbt 0.13.6 .sbtconfigjest przestarzały . Modyfikuj w /usr/local/etc/sbtoptsnastępujący sposób:

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

Możesz także utworzyć .sbtoptsplik w katalogu głównym projektu SBT, używając tej samej składni, co w /usr/local/etc/sbtoptspliku. Dzięki temu projekt jest samowystarczalny.

Przed sbt 0.13.6 można było ustawić opcje w .sbtconfig dla procesów nierozdzielonych :

  1. Sprawdź, gdzie jest sbt:

    $ which sbt
    /usr/local/bin/sbt
  2. Spójrz na zawartość:

    $ cat /usr/local/bin/sbt
    #!/bin/sh
    test -f ~/.sbtconfig && . ~/.sbtconfig
    exec java ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.1/libexec/sbt-launch.jar "$@"
  3. Ustaw odpowiednie opcje jvm, aby zapobiec OOM (zarówno zwykłemu, jak i PermGen):

    $ cat ~/.sbtconfig
    SBT_OPTS="-Xms512M -Xmx3536M -Xss1M 
     -XX:+CMSClassUnloadingEnabled 
     -XX:+UseConcMarkSweepGC -XX:MaxPermSize=724M"

Jeśli chcesz ustawić SBT_OPTS tylko dla bieżącego uruchomienia sbt, możesz użyć env SBT_OPTS=".." sbtzgodnie z sugestią Googol Shan. Można też użyć opcji dodanej w SBT 12: sbt -mem 2048. Staje się to nieporęczne w przypadku dłuższych list opcji, ale może pomóc, jeśli masz różne projekty o różnych potrzebach.

Zwróć uwagę, że CMSClassUnloadingEnabled w połączeniu z UseConcMarkSweepGC pomaga utrzymać czystość przestrzeni PermGen, ale w zależności od używanych frameworków możesz mieć rzeczywisty wyciek na PermGen, który ostatecznie wymusza ponowne uruchomienie.

iwein
źródło
@iwein - javaOptions nie zmieniło domyślnego obszaru sterty dla sbt. Sprawdziłem w jconsole i po prostu pokazuje -Xmx512M. Nawet jeśli dodam SBT_OPTS w ~ / .sbtconfig, nadal otrzymuję to w jconsole: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC. Czy widzisz Xmx512 z przodu? W pewnym sensie nie wybiera javaOptions z Build.scala. Jakieś wskazówki?
Anand
@Anand być może w 0.13 rzeczy działają nieco inaczej? Zaktualizuję odpowiedź, jeśli w coś wpadnę (może to chwilę potrwać), daj mi znać, jeśli w międzyczasie się zorientujesz.
Iwein
@iwein Właśnie użyłem następujących elementów w mojej Build.scala i zadziałało. fork in run: = true, javaOptions in run ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC"). Zobacz ten post, aby uzyskać odpowiedź stackoverflow.com/questions/27372468/… . Dzięki!
Anand
2
FYI, możesz również utworzyć .sbtoptsplik w katalogu głównym swojego projektu SBT, używając tej samej składni, co w /usr/local/etc/sbtoptspliku. Dzięki temu Twój projekt jest samowystarczalny, co może być bardzo przydatne w sytuacjach CI.
Age Mooij
W systemie Windows przy użyciu wersji 0.13.9 (może to być 0.13.6) plik to C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt. Domyślnie plik zawierał "-Xmx512M" bez -J pokazanego w tej odpowiedzi. Mogę potwierdzić, że ten plik jest odczytywany przez fakt, że zespół sbt wyświetla ostrzeżenie dotyczące -XX: MaxPermSize i kiedy zmieniam tę wartość, ostrzeżenie pokazuje wartość, którą wprowadziłem, a nie wartość "256m", którą pokazała pierwotnie.
Night Owl
69

W wersji SBT 12 i nowszych jest do tego opcja:

$sbt -mem 2048 
Prashant Sharma
źródło
5
na win 8.1, to polecenie nie działa dla mnie:Not a valid command: mem (similar: set)
Kevin Meredith
43

Jeśli uruchamiasz sbt w powłoce Linuksa, możesz użyć:

env JAVA_OPTS="-Xmx512m" sbt run

To jest moje zwykle używane polecenie do uruchomienia mojego projektu sbt.

Googol Shan
źródło
1
Dziękuję Ci bardzo. Fajne polecenie, aby wiedzieć. Nigdy nie wiedziałem o tym „env” i wiele razy brakowało mi takiego narzędzia.
Ivan
4
Hmm, to mi się nie udało! Potrzebowałem override def forkrozwiązania powyżej. (sbt 0.7.7)
Scott Morrison,
2
jest możliwe, że twój plik sbt określa własne JAVA_OPTS, w którym to przypadku zostaną one nadpisane. Następnie możesz bezpośrednio zmodyfikować plik sbt, aby usunąć flagę -Xmx lub przełączyć go na żądany maksymalny rozmiar sterty.
nnythm
23

.sbtconfigjest przestarzały, począwszy od SBT 0.13.6. Zamiast tego skonfigurowałem te opcje w /usr/local/etc/sbtoptsnastępujący sposób:

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
mniam mniam mniam
źródło
1
-J-Xss1Mjest nieco niska dla dużych klas przypadków, 4M wydaje się bezpieczniejsze.
Marius Soutier
7

Znam jeden sposób. Ustaw zmienną środowiskową JAVA_OPTS.

JAVA_OPTS='-Xmx512m'

Nie znalazłem sposobu, aby to zrobić jako parametr polecenia.

Synesso
źródło
7

Użyj JAVA_OPTS do ustawienia ze zmienną środowiskową.

Użyj opcji -JX do sbt dla poszczególnych opcji, np. -J-Xmx2048 -J-XX: MaxPermSize = 512

Nowsze wersje sbt mają opcję „-mem”.

Brett
źródło
5

Plik javaOptions += "-XX:MaxPermSize=1024"w naszym build.sbt, do którego odwołuje się @iwein powyżej, zadziałał dla nas, gdy zobaczyliśmy błąd java.lang.OutOfMemoryError wyrzucony podczas uruchamiania testów Specs2 za pośrednictwem sbt.

Pete Neisen
źródło
1
@UwePlonus to odpowiedź na pytanie.
VasiliNovikov,
3

Zmienna środowiskowa to _JAVA_OPTIONS, którą należy ustawić. Po ustawieniu opcji _JAVA_OPTIONS, a gdy sbt, sbt wyświetli komunikat przy użyciu JAVA_OPTIONS i wartości.

Alternatywnie możesz ustawić javaOption w pliku sbt lub .scala np

javaOptions += "-Xmx1G"

Z powłoki SBT można uruchomić polecenie show javaOptions, aby zobaczyć ustawione wartości.

Sajive Kumar
źródło
1
    javaOptions in Test += "-Xmx1G"

Spowoduje to ustawienie opcji JVM dla testów. Działa również z forkingiem jvm ( fork in Test := true).

VasiliNovikov
źródło
1
gdzie jest to ustawione w build.sbt?
javadba,
Gdziekolwiek, jeśli masz projekt jednomodułowy. Kolejność definicji na ogół nie ma znaczenia w SBT. Jeśli masz wiele modułów, określ to na niektórych z nich lub, jeśli chcesz, globalnie za pośrednictwem javaOptions in ThisBuild += "-Xmx1G"lubjavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov