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.