Wie kann die maximale JVM-Heap-Größe "-Xmx" zum Ausführen einer Anwendung mit der Aktion "Ausführen" in SBT angegeben werden?

97

Meine Anwendung verarbeitet große Datenfelder und benötigt standardmäßig mehr Speicher als JVM. Ich weiß, dass es in Java durch die Option "-Xmx" angegeben wird. Wie richte ich SBT so ein, dass ein bestimmter Wert "-Xmx" zum Ausführen einer Anwendung mit der Aktion "Ausführen" verwendet wird?

Ivan
quelle

Antworten:

17

Versuche dies:

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
quelle
53
Dies ist veraltet, jetzt können Sie verwendenjavaOptions += "-Xmx1G"
iwein
1
@iwein der Inhalt meines Beitrags scheint Ihnen sehr wichtig zu sein.
Arne
2
Beachten Sie, dass dies javaOptionsnur für gegabelte JVMs gilt (siehe scala-sbt.org/0.13/docs/Forking.html )
Yar
1
Hinzufügen fork in run := ture ermöglichtjavaOptions
coanor
@coanor diese Antwort ist für eine alte Version von sbt. Es gibt eine Antwort mit viel höheren Platzierungen direkt unter dieser. Diese Antwort war die richtige Antwort zu dem Zeitpunkt, als die Frage gestellt wurde.
Arne
113

Für gegabelte Prozesse sollten Sie sich Build.scala ansehen

Um die Java-Optionen für gegabelte Prozesse zu ändern, müssen Sie sie in der Build.scala (oder wie auch immer Sie Ihren Build genannt haben) wie folgt angeben:

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

Dadurch erhalten Sie die richtigen Optionen, ohne JAVA_OPTS global zu ändern, und es werden benutzerdefinierte JAVA_OPTS in ein von sbt generiertes Startskript eingefügt

Für nicht gegabelte Prozesse ist es am bequemsten, die Konfiguration über sbtoptsoder sbtconfigabhängig von Ihrer sbt-Version festzulegen.

Da sbt 0.13.6 .sbtconfigveraltet ist . Ändern Sie /usr/local/etc/sbtoptsin diese Richtung:

-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

Sie können auch eine .sbtoptsDatei im Stammverzeichnis Ihres SBT-Projekts mit derselben Syntax wie in der /usr/local/etc/sbtoptsDatei erstellen. Dies macht das Projekt in sich geschlossen.

Vor sbt 0.13.6 konnten Sie die Optionen in .sbtconfig für nicht gegabelte Prozesse festlegen :

  1. Überprüfen Sie, wo sbt ist:

    $ which sbt
    /usr/local/bin/sbt
  2. Schauen Sie sich den Inhalt an:

    $ 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. Stellen Sie die richtigen JVM-Optionen ein, um OOM zu verhindern (sowohl reguläres als auch PermGen):

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

Wenn Sie SBT_OPTS nur für die aktuelle Ausführung von sbt festlegen möchten, können Sie diese env SBT_OPTS=".." sbtwie von Googol Shan vorgeschlagen verwenden. Oder Sie können die in Sbt 12 hinzugefügte Option verwenden : sbt -mem 2048. Dies wird für längere Listen von Optionen unhandlich, kann jedoch hilfreich sein, wenn Sie unterschiedliche Projekte mit unterschiedlichen Anforderungen haben.

Beachten Sie, dass CMSClassUnloadingEnabled in Verbindung mit UseConcMarkSweepGC dazu beiträgt, den PermGen-Speicherplatz sauber zu halten. Abhängig von den von Ihnen verwendeten Frameworks kann es jedoch zu einem tatsächlichen Leck in PermGen kommen, das möglicherweise einen Neustart erzwingt.

iwein
quelle
@iwein - Die javaOptions haben den Standard-Heapspace für sbt nicht geändert. Ich habe in jconsole eingecheckt und es zeigt nur -Xmx512M. Selbst wenn ich SBT_OPTS in ~ / .sbtconfig hinzufüge, erhalte ich dies in jconsole: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC. Sehen Sie den Xmx512 vorne? In manchen Fällen werden die javaOptions nicht aus Build.scala ausgewählt. Irgendwelche Hinweise?
Anand
@Anand vielleicht funktionieren die Dinge in 0.13 etwas anders? Ich werde die Antwort aktualisieren, wenn ich auf etwas stoße (es kann eine Weile dauern). Lassen Sie mich wissen, wenn Sie es in der Zwischenzeit herausfinden.
iwein
@iwein Ich habe gerade Folgendes in meiner Build.scala verwendet und es hat funktioniert. Fork in Run: = true, JavaOptions in Run ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC"). In diesem Beitrag finden Sie die Antwort stackoverflow.com/questions/27372468/… . Vielen Dank!
Anand
2
Zu Ihrer Information, Sie können auch eine .sbtoptsDatei im Stammverzeichnis Ihres SBT-Projekts mit derselben Syntax wie in der /usr/local/etc/sbtoptsDatei erstellen. Dies macht Ihr Projekt in sich geschlossen, was in CI-Situationen sehr praktisch sein kann.
Alter Mooij
Unter Windows mit 0.13.9 (möglicherweise 0.13.6) lautet die Datei C: \ Programme (x86) \ sbt \ conf \ sbtconfig.txt. Standardmäßig enthielt die Datei "-Xmx512M" ohne das in dieser Antwort gezeigte -J. Ich kann bestätigen, dass diese Datei gelesen wird, indem die sbt-Assembly eine Warnung bezüglich -XX: MaxPermSize ausgibt. Wenn ich diesen Wert ändere, zeigt die Warnung den eingegebenen Wert und nicht den ursprünglich angezeigten Wert "256m".
Nachteule
68

Ab sbt 12 gibt es hierfür eine Option:

$sbt -mem 2048 
Prashant Sharma
quelle
5
Bei Sieg 8.1 funktionierte dieser Befehl nicht für mich:Not a valid command: mem (similar: set)
Kevin Meredith
43

Wenn Sie sbt unter Linux-Shell ausführen, können Sie Folgendes verwenden:

env JAVA_OPTS="-Xmx512m" sbt run

Dies ist mein normalerweise verwendeter Befehl zum Ausführen meines sbt-Projekts.

Googol Shan
quelle
1
Vielen Dank. Ein cooler Befehl zu wissen. Ich wusste nie von diesem "env" und habe ein solches Tool oft verpasst.
Ivan
4
Hmm, das hat bei mir nicht funktioniert! Ich brauchte die override def forkobige Lösung. (sbt 0.7.7)
Scott Morrison
2
Es ist möglich, dass Ihre sbt-Datei ein eigenes JAVA_OPTS angibt. In diesem Fall werden diese überschrieben. Sie können Ihre sbt-Datei dann direkt ändern, entweder um das Flag -Xmx zu entfernen oder um es auf die gewünschte maximale Heap-Größe umzustellen.
nnythm
23

.sbtconfigist ab SBT veraltet 0.13.6. Stattdessen habe ich diese Optionen /usr/local/etc/sbtoptsfolgendermaßen konfiguriert :

-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
OM Nom Nom
quelle
1
-J-Xss1Mist für große Fallklassen etwas niedrig, 4M scheint sicherer zu sein.
Marius Soutier
7

Ich kenne einen Weg. Setzen Sie die Umgebungsvariable JAVA_OPTS.

JAVA_OPTS='-Xmx512m'

Ich habe keine Möglichkeit gefunden, dies als Befehlsparameter zu tun.

Synesso
quelle
7

Verwenden Sie JAVA_OPTS zum Festlegen mit Umgebungsvariablen.

Verwenden Sie -JX-Optionen, um einzelne Optionen zu sbt, z. B. -J-Xmx2048 -J-XX: MaxPermSize = 512

Neuere Versionen von sbt haben die Option "-mem".

Brett
quelle
5

Die javaOptions += "-XX:MaxPermSize=1024"in unserer build.sbt, auf die oben von @iwein verwiesen wurde, funktionierte für uns, als wir einen java.lang.OutOfMemoryError sahen, der beim Ausführen von Specs2-Tests durch sbt ausgelöst wurde.

Pete Neisen
quelle
1
@UwePlonus beantwortet die Frage.
VasiliNovikov
3

Die Umgebungsvariable ist _JAVA_OPTIONS, die festgelegt werden muss. Sobald Sie _JAVA_OPTIONS festgelegt haben und sbt, zeigt sbt die Nachricht mit JAVA_OPTIONS und den Werten an.

Alternativ können Sie javaOption in der Datei sbt oder .scala festlegen, z

javaOptions += "-Xmx1G"

In der sbt-Shell können Sie show javaOptions ausführen, um die festgelegten Werte anzuzeigen.

Sajive Kumar
quelle
1
    javaOptions in Test += "-Xmx1G"

Dadurch werden die JVM-Optionen für Tests festgelegt. Funktioniert auch mit jvm forking ( fork in Test := true).

VasiliNovikov
quelle
1
Wo ist das in der build.sbt?
Javadba
Überall, wenn Sie ein 1-Modul-Projekt haben. Die Reihenfolge der Definitionen spielt in SBT im Allgemeinen keine Rolle. Wenn Sie mehrere Module haben, geben Sie dies entweder auf einigen von ihnen oder, wenn Sie möchten, global über javaOptions in ThisBuild += "-Xmx1G"oderjavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov
1

Mit sbt können Sie die JVM-Optionen auflisten, die Sie zum Ausführen Ihres Projekts in einer Datei mit dem Namen benötigen

.jvmopts

in der Wurzel Ihres Projekts. Fügen Sie dann die gewünschten Java-Optionen hinzu

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

Es wurde getestet und funktioniert unter Windows 10 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html

Ar maj
quelle