Come impostare la dimensione dell'heap per sbt?


90

Sto usando SBT 0.12.0. Ho letto altre risposte sullo stack overflow e le ho seguite, tuttavia nessuna di esse aiuta, ad esempio:

  • create ForkRunclass - Non ho osservato alcun processo forkato durante l'utilizzo di sbt
  • imposta la variabile di ambiente JAVA_OPTS- è impostata ma la riga di comando del processo di sbt non sembra utilizzarla affatto.
  • sbt -J-Xmx2Gaggiunge il parametro alla riga di comando del processo sbt, tuttavia il vecchio valore -Xmx1536mviene utilizzato da sbt invece del parametro aggiunto.

Mi sto perdendo qualcosa? Come imposto la dimensione dell'heap per sbt 0.12, quando eseguo sia il test che run?


9
Hai provato il memparametro quando hai avviato sbt? (ad esempio sbt -mem2000)
om-nom-nom

2
Potresti avere un errore di battitura, dovrebbe essere JAVA_OPTS non JAVA_OPS
Noah

Controlla la mia risposta a un duplicato di questa domanda. stackoverflow.com/questions/3868863/… la risposta contrassegnata è sbagliata, ma la mia funziona (a volte è necessario controllare anche commenti / voti :)
iwein

Risposte:


101

Hai bisogno SBT_OPTS, ecco cosa uso nel mio .bash_profile :

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

AGGIORNAMENTO: per ottenere il tuo spazio heap 2G puoi usare questo:

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

NOTA: SBT DEVE ESSERE ULTIMA VERSIONE

Le versioni precedenti di sbtcontengono bug che sovrascrivono queste impostazioni, utilizzare brew upgrade sbtper le ultime sbtper Mac (supponendo che brew install) (IDK per Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848


1
Grazie. In effetti cambia la riga di comando del processo sbt come previsto, tuttavia il vecchio -Xmx1546mesiste ancora nella riga di comando e la dimensione massima dell'heap è ancora limitata a 1,5 GB, come mostrato in visualvm.

1
qualche modo per impostare questa impostazione di ambiente nella configurazione SBT che è controllata dal codice sorgente?
Kevin Meredith

Dai un'occhiata al sorgente di scalaz, hanno un file bash chiamato sbt che carica tutto ciò di cui hanno bisogno, ovvero è specifico per l'ambiente github.com/scalaz/scalaz/blob/series/7.2.x/sbt
Noah

4
Ricevo un avviso:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
samthebest

1
@samthebest Perm Gen è stato sostanzialmente rimosso in Java 8, quindi non è necessario includerlo.
Noah

65

A partire da marzo 2015, se stai usando sbt su OSX con Homebrew , dovresti modificare il file/usr/local/etc/sbtopts

per esempio

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

5
Questo sembra funzionare bene anche per Windows, invece di dover scherzare con le variabili env (il file si trova in c: \ program files \ sbt \ confs).
Luciano

2
In Linux è in /etc/sbt-launcher-packaging.
Robin Green

1
In Ubuntu Artful, l'ho trovato in/etc/sbt/sbtopts
Synesso

Questa soluzione renderà la JVM preallocare tutta la memoria da 2 GB. Se utilizzi SBT_OPTS=-Xmx2G sbtper avviare SBT, l'heap aumenterà secondo necessità fino a un massimo di 2 GB.
mgd

Dai un'occhiata alla soluzione @ Mike s sopra: stackoverflow.com/a/55706960/1199564
MGD

42

"sbt -mem 23000 run" funziona per me.


6
questo è 23 GB non è vero ..?
Ben Hutchison

1
@BenHutchison questo è probabilmente il wrapper sbt di paulp, non è l'originale sbt
matanster

19

Ho trovato la soluzione. Indipendentemente da come si specifica la dimensione dell'heap JVM, non funzionerà mai perché l'eseguibile SBT lo ha già sovrascritto.

C'è una riga nell'eseguibile SBT che dice:

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

Quindi ho modificato il file:

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

Rimuovi la -linea.

Ora, quando esegui SBT, non sovrascriverà più le impostazioni della dimensione dell'heap della JVM. È possibile specificare le impostazioni della dimensione dell'heap utilizzando la risposta di @ Noan.

Oppure in alternativa:

sbt -J-Xmx4G -J-Xms4G


3
In realtà sembra che export SBT_OPTS="..."in ~/.sbtconfigfunziona davvero.
Erik Kaplun

15

Su Windows, per sbt 0.13.9.2, devi impostare JAVA_OPTSle opzioni jvm che desideri.

> set JAVA_OPTS=-Xmx1G
> sbt assembly

Lo sbt.batscript carica i suoi valori predefiniti da conf\sbtconfig.txtin CFG_OPTSma utilizzerà JAVA_OPTSinvece se impostato.

Estratti rilevanti da 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!
)

. . . (Salta) . . .

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

Stavo cercando di risolvere un problema come questo su Mac OS X con un'installazione homebrew di SBT. Se hai installato SBT tramite homebrew, sei in chiaro poiché il /usr/local/bin/sbtfile ha l'aspetto

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

Ciò significa che tutte le impostazioni che inserisci SBT_OPTSrimarranno valide (il tuo -Xmx avrà la precedenza). Inoltre, la prima riga dello script eseguirà qualsiasi comando ~/.sbtconfigse esiste, quindi potrebbe essere un posto migliore per mettere le tue opzioni SBT se stai giocando con loro un po '. Non dovrai farlo source ~/.bash_profileogni volta che apporti una modifica aSBT_OPTS


2
sì. Questo è quello che ho in $ HOME / .sbtconfig. export SBT_OPTS = "- XX: MaxPermSize = 512M -Xmx2G -Xms64M" e quando avvio sbt, eseguo un ps aux e viene visualizzato / usr / bin / java -Xmx512M -XX: MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / sbt / 0.13.0 / libexec / sbt-launch.jar
Adrian Rodriguez

Tuttavia, ho appena visto la risposta di seguito e forse quel launcher è per un altro tipo di installazione. La mia configurazione è specifica per Mac utilizzando il pacchetto homebrew.
Adrian Rodriguez

2
Homebrew SBT ora richiede la configurazione della dimensione dell'heap con il -memparametro in/usr/local/etc/sbtopts
Synesso

6

Se esegui sbt da PowerShell, imposta la SBT_OPTsvariabile di ambiente, in questo modo:

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

Quindi esegui:

sbt

6

Per SBT versione 1.0.4 su Windows, le impostazioni JVMsbt\conf\sbtconfig.txt predefinite provengono da file. Modifica semplicemente i valori qui. Cambia -Xmx512Min -Xmx2048M.

Questa non è l'unica fonte di opzioni JVM per SBT. Altri possono essere trovati ispezionando sbt.bat. Un modo semplice per diagnosticare, dove fare le impostazioni vengono, è commentando questa linea nel file batch: @echo off.


Nota: questo sbt\confnon si trova nella directory dell'utente, ma nella cartella Programmi, come C:\Program Files (x86)\sbt\conf.
Suma

5

Un modo rapido per farlo è con un .jvmoptsfile nella radice del tuo progetto (dalla documentazione di Lagom Framework ):

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

1
Questa dovrebbe essere contrassegnata come risposta corretta in quanto consente anche le impostazioni per progetto.
mgd

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.