Wie stelle ich die Heap-Größe für sbt ein?


87

Ich benutze SBT 0.12.0. Ich habe andere Antworten zum Stapelüberlauf gelesen und bin ihnen gefolgt, aber keine davon hilft zum Beispiel:

  • ForkRunKlasse erstellen - Ich habe während meiner Verwendung von sbt keinen gegabelten Prozess beobachtet
  • Umgebungsvariable festlegen JAVA_OPTS- Sie wird festgelegt, aber die Prozessbefehlszeile von sbt scheint sie überhaupt nicht zu verwenden.
  • sbt -J-Xmx2GHängt den Parameter an die Befehlszeile des sbt-Prozesses an. Der alte Wert -Xmx1536mwird jedoch von sbt anstelle des angehängten Parameters verwendet.

Vermisse ich etwas Wie stelle ich die Heap-Größe für sbt 0.12 ein, wenn ich sowohl teste als auch run?


8
Haben Sie memParameter beim Starten von sbt ausprobiert? (zB sbt -mem2000)
om-nom-nom

2
Sie könnten einen Tippfehler haben, es sollte JAVA_OPTS sein, nicht JAVA_OPS
Noah

Schauen Sie sich meine Antwort auf ein Duplikat dieser Frage an. stackoverflow.com/questions/3868863/… die markierte Antwort dort ist falsch, aber meine funktioniert (manchmal müssen Sie auch Kommentare / Stimmen überprüfen :)
iwein

Antworten:


100

Folgendes brauche SBT_OPTSich in meinem .bash_profile :

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

UPDATE: Um Ihren 2G-Heap-Speicherplatz zu erhalten, können Sie Folgendes verwenden:

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

HINWEIS: SBT MUSS DIE NEUESTE VERSION SEIN

Ältere Versionen von sbtenthalten Fehler, die diese Einstellungen überschreiben. Verwenden Sie sie brew upgrade sbtfür die neueste Version sbtfür Mac (vorausgesetzt, Brew wird installiert) (IDK für Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848


1
Danke dir. Die Befehlszeile des sbt-Prozesses wird zwar wie erwartet geändert, die alte ist jedoch -Xmx1546mnoch in der Befehlszeile vorhanden, und die maximale Heap-Größe ist weiterhin auf 1,5 GB begrenzt, wie in visualvm gezeigt.

1
Gibt es eine Möglichkeit, diese Umgebungseinstellung in der quellengesteuerten SBT-Konfiguration festzulegen?
Kevin Meredith

Werfen Sie einen Blick auf die Quelle von scalaz. Sie haben eine Bash-Datei namens sbt, die alles lädt, was sie benötigen, auch bekannt als umgebungsspezifisch. Github.com/scalaz/scalaz/blob/series/7.2.x/sbt
Noah

4
Ich bekomme eine Warnung:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
Samthebest

1
@samthebest Perm Gen wurde in Java 8 grundsätzlich entfernt, daher ist es nicht erforderlich, dies einzuschließen.
Noah

64

Wenn Sie ab März 2015 sbt unter OSX mit Homebrew verwenden , sollten Sie die Datei bearbeiten/usr/local/etc/sbtopts

z.B

# set memory options
#
#-mem   <integer>
-mem 2048

5
Dies scheint auch für Windows gut zu funktionieren, anstatt mit env-Variablen herumspielen zu müssen (die Datei befindet sich unter c: \ program files \ sbt \ confs).
Luciano

2
Unter Linux ist es in /etc/sbt-launcher-packaging.
Robin Green

1
In Ubuntu Artful fand ich es in/etc/sbt/sbtopts
Synesso

Mit dieser Lösung weist die JVM den gesamten 2-GB-Speicher vorab zu. Wenn Sie SBT_OPTS=-Xmx2G sbtSBT starten, wird der Heap nach Bedarf auf maximal 2 GB vergrößert.
mgd

Schauen Sie sich die Lösung von @mike oben an: stackoverflow.com/a/55706960/1199564
mgd

41

"sbt -mem 23000 run" funktioniert bei mir.


6
das sind 23 GB, nicht wahr?
Ben Hutchison

1
@ BenHutchison Dies ist wahrscheinlich Paulps Sbt Wrapper, nicht das Original Sbt ist es
Matanster

19

Ich habe die Lösung gefunden. Unabhängig davon, wie Sie die Größe des JVM-Heapspeichers angeben, funktioniert dies niemals, da die ausführbare SBT-Datei diese bereits überschrieben hat.

In der ausführbaren SBT-Datei gibt es eine Zeile mit der Aufschrift:

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

Also habe ich die Datei bearbeitet:

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

Entfernen Sie die -Leitung.

Wenn Sie jetzt SBT ausführen, werden Ihre Einstellungen für die Größe des JVM-Heapspeichers nicht mehr überschrieben. Sie können die Einstellungen für die Heap-Größe mithilfe der Antwort von @ Noan festlegen.

Oder alternativ:

sbt -J-Xmx4G -J-Xms4G


3
Eigentlich scheint es, dass export SBT_OPTS="..."in ~/.sbtconfigtatsächlich funktioniert.
Erik Kaplun

15

Unter Windows müssen Sie für sbt 0.13.9.2 JAVA_OPTSdie gewünschten JVM-Optionen festlegen.

> set JAVA_OPTS=-Xmx1G
> sbt assembly

Das sbt.batSkript lädt seine Standardeinstellungen von conf\sbtconfig.txtin CFG_OPTS, wird jedoch JAVA_OPTSstattdessen verwendet, wenn es festgelegt ist.

Relevante Auszüge aus 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!
)

. . . (überspringen). . .

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

Ich wollte ein Problem wie dieses unter Mac OS X mit einer Homebrew-Installation von SBT lösen. Wenn Sie SBT über Homebrew installiert haben, sind Sie im klaren, da die /usr/local/bin/sbtDatei so aussieht

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

Dies bedeutet, dass alle von Ihnen SBT_OPTSeingegebenen Einstellungen erhalten bleiben (Ihr -Xmx hat Vorrang). Darüber hinaus werden in der ersten Zeile des Skripts alle Befehle ausgeführt, ~/.sbtconfigsofern vorhanden, sodass Sie Ihre SBT-Optionen möglicherweise besser platzieren können, wenn Sie viel mit ihnen spielen. Sie müssen nicht source ~/.bash_profilejedes Mal, wenn Sie eine Änderung vornehmenSBT_OPTS


2
Ja. Dies ist, was ich in $ HOME / .sbtconfig habe. export SBT_OPTS = "- XX: MaxPermSize = 512M -Xmx2G -Xms64M" und wenn ich sbt starte, mache ich einen ps aux und es zeigt / usr / bin / java -Xmx512M -XX: MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / sbt / 0.13.0 / libexec / sbt-launch.jar
Adrian Rodriguez

Allerdings habe ich gerade die Antwort unten gesehen und vielleicht ist dieser Launcher für eine andere Art von Setup. Mein Setup ist spezifisch für Mac mit dem Homebrew-Paket.
Adrian Rodriguez

2
Homebrew SBT erfordert jetzt, dass die Heap-Größe mit dem -memParameter in/usr/local/etc/sbtopts
Synesso

6

Wenn Sie sbt über PowerShell ausführen, legen Sie die SBT_OPTsUmgebungsvariable wie folgt fest :

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

Dann renne:

sbt

6

Für SBT Version 1.0.4 unter Windows stammen die Standard- JVM-Einstellungen aus dersbt\conf\sbtconfig.txt Datei. Bearbeiten Sie einfach die Werte hier. Wechseln Sie -Xmx512Mzu -Xmx2048M.

Dies ist nicht die einzige Quelle für JVM-Optionen für SBT. Andere können durch Inspektion gefunden werden sbt.bat. Eine einfache Möglichkeit zur Diagnose, woher die Einstellungen stammen, besteht darin, diese Zeile in einer Batchdatei auskommentieren : @echo off.


Hinweis: Dies sbt\confwird nicht im Benutzerverzeichnis, sondern im Ordner "Programme" abgelegt C:\Program Files (x86)\sbt\conf.
Suma

3

Eine schnelle Möglichkeit hierfür ist eine .jvmoptsDatei im Stammverzeichnis Ihres Projekts (aus der Lagom Framework-Dokumentation ):

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

Dies sollte als die richtige Antwort markiert sein, da dies auch die Einstellungen pro Projekt ermöglicht.
mgd

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.