Come specificare la dimensione massima dell'heap JVM "-Xmx" per l'esecuzione di un'applicazione con l'azione "run" in SBT?


97

La mia applicazione esegue l'elaborazione di array di dati di grandi dimensioni e richiede più memoria di quella fornita da JVM per impostazione predefinita. So che in Java è specificato dall'opzione "-Xmx". Come faccio a impostare SBT per utilizzare un particolare valore "-Xmx" per eseguire un'applicazione con l'azione "esegui"?

Risposte:


17

Prova questo:

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)
    })
}

53
Questo è obsoleto, ora puoi usarejavaOptions += "-Xmx1G"
iwein

1
@iwein il contenuto del mio post sembra essere molto importante per te.
Arne

2
Nota che javaOptionshanno effetto solo per le JVM biforcute (vedi scala-sbt.org/0.13/docs/Forking.html )
Yar

1
Aggiungi fork in run := ture abilitazionijavaOptions
coanor

@coanor questa risposta è per una versione antica di sbt. C'è una risposta con classifiche molto più alte appena sotto questa. Questa risposta era la risposta corretta al momento in cui è stata posta la domanda.
Arne

113

Per i processi biforcuti dovresti guardare Build.scala

Per modificare le opzioni java per i processi biforcati devi specificarli nel Build.scala (o qualunque cosa tu abbia chiamato la tua build) in questo modo:

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

Questo ti darà le opzioni corrette senza modificare JAVA_OPTS a livello globale e inserirà JAVA_OPTS personalizzato in uno script di avvio generato da sbt

Per i processi non biforcati è più conveniente impostare la configurazione tramite sbtoptso in sbtconfigbase alla versione di sbt.

Poiché sbt 0.13.6 .sbtconfigè deprecato . Modifica /usr/local/etc/sbtoptsseguendo queste linee:

-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

Puoi anche creare un .sbtoptsfile nella radice del tuo progetto SBT usando la stessa sintassi del /usr/local/etc/sbtoptsfile. Questo rende il progetto autonomo.

Prima di sbt 0.13.6 potevi impostare le opzioni in .sbtconfig per processi non forkati :

  1. Controlla dove si trova sbt:

    $ which sbt
    /usr/local/bin/sbt
  2. Guarda i contenuti:

    $ 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. Imposta le opzioni jvm corrette per prevenire l'OOM (sia regolare che PermGen):

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

Se vuoi impostare SBT_OPTS solo per l'esecuzione corrente di sbt puoi usare env SBT_OPTS=".." sbtcome suggerito da Googol Shan. Oppure si può utilizzare l'opzione aggiunta nel Sbt 12: sbt -mem 2048. Questo diventa ingombrante per elenchi più lunghi di opzioni, ma potrebbe essere utile se hai progetti diversi con esigenze diverse.

Nota che CMSClassUnloadingEnabled in concerto con UseConcMarkSweepGC aiuta a mantenere pulito lo spazio PermGen, ma a seconda dei framework che usi potresti avere una perdita effettiva su PermGen, che alla fine forza un riavvio.


@iwein - javaOptions non ha modificato lo spazio heap predefinito per sbt. Ho controllato in jconsole e mostra solo -Xmx512M. Anche se aggiungo SBT_OPTS in ~ / .sbtconfig, ottengo comunque questo in jconsole: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC. Vedi l'Xmx512 davanti? In qualche modo non seleziona javaOptions da Build.scala. Qualche suggerimento?
Anand

@ An e forse le cose funzionano in modo leggermente diverso in 0.13? Aggiornerò la risposta se mi imbatto in qualcosa (potrebbe volerci un po '), fammi sapere se nel frattempo lo capisci.
iwein

@iwein Ho appena usato quanto segue nel mio Build.scala e ha funzionato. fork in run: = true, javaOptions in run ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC"). Vedi questo post per la risposta stackoverflow.com/questions/27372468/… . Grazie!
Anand

2
Cordiali saluti, puoi anche creare un .sbtoptsfile nella radice del tuo progetto SBT usando la stessa sintassi del /usr/local/etc/sbtoptsfile. Questo rende il tuo progetto autonomo, il che può essere molto utile nelle situazioni CI.
Età Mooij

Su Windows che utilizza 0.13.9 (potrebbe essere 0.13.6) il file è C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt. Per impostazione predefinita, il file conteneva "-Xmx512M" senza -J mostrato in questa risposta. Posso confermare che questo file viene letto dal fatto che l'assembly sbt emette un avviso relativo a -XX: MaxPermSize e quando cambio quel valore l'avviso mostra il valore che ho inserito e non il valore "256m" mostrato originariamente.
Night Owl

68

Nella versione sbt 12 in poi c'è un'opzione per questo:

$sbt -mem 2048 

5
su win 8.1, questo comando non ha funzionato per me:Not a valid command: mem (similar: set)
Kevin Meredith

43

Se esegui sbt sulla shell di Linux, puoi usare:

env JAVA_OPTS="-Xmx512m" sbt run

Questo è il mio comando di solito usato per eseguire il mio progetto sbt.


1
Grazie mille. Un bel comando da sapere. Non ho mai saputo di questo "env" e mi sono perso un tale strumento molte volte.
Ivan

4
Hmm, questo non ha funzionato per me! Avevo bisogno della override def forksoluzione sopra. (sbt 0.7.7)
Scott Morrison

2
è possibile che il tuo file sbt specifichi i propri JAVA_OPTS, nel qual caso questi verranno sovrascritti. È quindi possibile modificare direttamente il file sbt, per rimuovere il flag -Xmx o per impostarlo sulla dimensione heap massima desiderata.
nnythm

23

.sbtconfigè deprecato a partire da SBT 0.13.6. Invece, ho configurato queste opzioni nel /usr/local/etc/sbtoptsmodo seguente:

-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

1
-J-Xss1Mè un po 'basso per le classi di case di grandi dimensioni, 4M sembra essere più sicuro.
Marius Soutier

7

C'è un modo che conosco. Imposta la variabile d'ambiente JAVA_OPTS.

JAVA_OPTS='-Xmx512m'

Non ho trovato un modo per farlo come parametro di comando.


7

Usa JAVA_OPTS per l'impostazione con la variabile d'ambiente.

Usa le opzioni -JX per sbt per le singole opzioni, ad esempio -J-Xmx2048 -J-XX: MaxPermSize = 512

Le versioni più recenti di sbt hanno un'opzione "-mem".


5

Il file javaOptions += "-XX:MaxPermSize=1024"nel nostro build.sbt a cui fa riferimento @iwein sopra ha funzionato per noi quando abbiamo visto un java.lang.OutOfMemoryError lanciato durante l'esecuzione di test Specs2 tramite sbt.


1
@ UwePlonus risponde alla domanda.
VasiliNovikov

3

La variabile d'ambiente è _JAVA_OPTIONS, che deve essere impostata. Dopo aver impostato _JAVA_OPTIONS, e quando sbt, sbt mostrerà il messaggio usando JAVA_OPTIONS ei valori.

In alternativa puoi impostare javaOption nel file sbt o .scala es

javaOptions += "-Xmx1G"

Dalla shell sbt è possibile eseguire show javaOptions per vedere i valori impostati.


1
    javaOptions in Test += "-Xmx1G"

Questo imposta le opzioni JVM per i test. Funziona anche con jvm fork ( fork in Test := true).


1
dov'è questo set nel build.sbt?
javadba

Ovunque, se hai un progetto a 1 modulo. L'ordine delle definizioni generalmente non ha importanza in SBT. Se hai più moduli, specificalo su alcuni di essi o, se vuoi, globalmente tramite javaOptions in ThisBuild += "-Xmx1G"ojavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.