Comment définir la taille du tas pour sbt?

90

J'utilise SBT 0.12.0. J'ai lu d'autres réponses sur le débordement de pile et je les ai suivies, mais aucune d'entre elles n'aide, par exemple:

  • create ForkRunclass - Je n'ai observé aucun processus forké lors de mon utilisation de sbt
  • définir la variable d'environnement JAVA_OPTS- elle est définie mais la ligne de commande de processus de sbt ne semble pas du tout l'utiliser.
  • sbt -J-Xmx2Gajoute le paramètre à la ligne de commande du processus sbt, mais l'ancienne valeur -Xmx1536mest utilisée par sbt au lieu du paramètre ajouté.

Est-ce que je manque quelque chose? Comment définir la taille du tas pour sbt 0.12, lorsque je teste et run?

Spydon
la source
9
Avez-vous essayé le memparamètre lorsque vous démarrez sbt? (par exemple sbt -mem2000)
om-nom-nom
2
Vous pourriez avoir une faute de frappe, cela devrait être JAVA_OPTS et non JAVA_OPS
Noah
Découvrez ma réponse à un double de cette question. stackoverflow.com/questions/3868863/ ... la réponse marquée est erronée, mais la mienne fonctionne (parfois vous devez également vérifier les commentaires / votes :)
iwein

Réponses:

101

Vous avez besoin SBT_OPTS, voici ce que j'utilise dans mon .bash_profile :

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

MISE À JOUR: Pour obtenir votre espace de tas 2G, vous pouvez utiliser ceci:

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

REMARQUE: SBT DOIT ÊTRE LA DERNIÈRE VERSION

Les anciennes versions de sbtcontiennent des bogues qui remplacent ces paramètres, utilisez brew upgrade sbtpour la dernière version sbtpour Mac (en supposant l'installation de brew) (IDK pour Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848

Noé
la source
1
Merci. Il modifie en effet la ligne de commande du processus sbt comme prévu, mais l'ancien -Xmx1546mexiste toujours dans la ligne de commande et la taille maximale du tas est toujours plafonnée à 1,5 Go, comme indiqué dans visualvm.
1
un moyen de définir ce paramètre d'environnement dans la configuration SBT qui est contrôlé par la source?
Kevin Meredith
Jetez un œil à la source scalaz, ils ont un fichier bash appelé sbt qui charge tout ce dont ils ont besoin, c'est-à-dire spécifique à l'environnement github.com/scalaz/scalaz/blob/series/7.2.x/sbt
Noah
4
Je reçois un avertissement:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
samthebest
1
@samthebest Perm Gen a été essentiellement supprimé dans Java 8, il n'est donc pas nécessaire de l'inclure.
Noah
66

À partir de mars 2015, si vous utilisez sbt sur OSX avec Homebrew, vous devez modifier le fichier/usr/local/etc/sbtopts

par exemple

# set memory options
#
#-mem   <integer>
-mem 2048
Synesso
la source
5
Cela semble aussi bien fonctionner pour Windows, au lieu d'avoir à jouer avec les variables env (le fichier est sous c: \ program files \ sbt \ confs).
Luciano
2
Sous Linux, c'est dans /etc/sbt-launcher-packaging.
Robin Green
1
Dans Ubuntu Artful, je l'ai trouvé dans/etc/sbt/sbtopts
Synesso
Cette solution obligera la JVM à préallouer la totalité de la mémoire de 2 Go. Si vous utilisez SBT_OPTS=-Xmx2G sbtpour démarrer SBT, il augmentera le tas selon les besoins jusqu'à un maximum de 2 Go.
mgd
Jetez un œil à la solution de @mike ci-dessus: stackoverflow.com/a/55706960/1199564
mgd
42

"sbt -mem 23000 run" fonctionne pour moi.

GBY
la source
6
thats 23Gb n'est-ce pas ..?
Ben Hutchison
1
@BenHutchison c'est probablement le wrapper sbt de Paulp, pas le sbt original est-il
matanster
19

J'ai trouvé la solution. Quelle que soit la façon dont vous spécifiez la taille du tas JVM, cela ne fonctionnera jamais car l'exécutable SBT l'a déjà remplacé.

Il y a une ligne dans l'exécutable SBT qui dit:

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

J'ai donc édité le fichier:

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

Retirez la -ligne.

Désormais, lorsque vous exécutez SBT, il ne remplacera plus vos paramètres de taille de tas JVM. Vous pouvez spécifier les paramètres de taille de tas en utilisant la réponse de @ Noan.

Ou bien:

sbt -J-Xmx4G -J-Xms4G


la source
3
En fait , il semble que export SBT_OPTS="..."dans ~/.sbtconfigfonctionne effectivement.
Erik Kaplun
15

Sous Windows, pour sbt 0.13.9.2, vous devez définir JAVA_OPTSles options jvm souhaitées.

> set JAVA_OPTS=-Xmx1G
> sbt assembly

Le sbt.batscript charge ses valeurs par défaut de conf\sbtconfig.txtinto CFG_OPTSmais l'utilisera à la JAVA_OPTSplace s'il est défini.

Extraits pertinents de 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!
)

. . . (sauter). . .

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 %*
choy
la source
11

Je cherchais à résoudre un problème comme celui-ci sur Mac OS X avec une installation homebrew de SBT. Si vous avez installé SBT via homebrew, vous êtes en clair puisque le /usr/local/bin/sbtfichier ressemble à

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

Cela signifie que tous les paramètres que vous avez mis SBT_OPTSresteront fidèles (votre -Xmx aura la priorité). De plus, la première ligne du script exécutera toutes les commandes ~/.sbtconfigs'il existe, donc ce peut être un meilleur endroit pour mettre vos options SBT si vous jouez un peu avec elles. Vous n'aurez pas à le faire source ~/.bash_profilechaque fois que vous modifiezSBT_OPTS

Adrian Rodriguez
la source
2
Oui. C'est ce que j'ai dans $ HOME / .sbtconfig. export SBT_OPTS = "- XX: MaxPermSize = 512M -Xmx2G -Xms64M" et quand je lance sbt, je fais un ps aux et il affiche / usr / bin / java -Xmx512M -XX: MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / sbt / 0.13.0 / libexec / sbt-launch.jar
Adrian Rodriguez
Cependant, je viens de voir la réponse ci-dessous et peut-être que ce lanceur est pour un autre type d'installation. Ma configuration est spécifique à Mac en utilisant le package homebrew.
Adrian Rodriguez
2
Homebrew SBT nécessite maintenant que la taille du tas soit configurée avec le -memparamètre in/usr/local/etc/sbtopts
Synesso
6

Si vous exécutez sbt à partir de PowerShell, définissez la SBT_OPTsvariable d'environnement, comme ceci:

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

Puis exécutez:

sbt
sungiant
la source
6

Pour SBT version 1.0.4 sous Windows, les paramètres JVMsbt\conf\sbtconfig.txt par défaut proviennent du fichier. Modifiez simplement les valeurs ici. Changer -Xmx512Men -Xmx2048M.

Ce n'est pas la seule source d'options JVM pour SBT. D'autres peuvent être trouvés en inspectant sbt.bat. Une façon simple de diagnostiquer, où faire les réglages viennent, est en commentant cette ligne dans le fichier batch: @echo off.

Jarekczek
la source
Remarque: il sbt\confn'est pas placé dans le répertoire utilisateur, mais dans le dossier Program Files, comme C:\Program Files (x86)\sbt\conf.
Suma
5

Un moyen rapide de le faire est avec un .jvmoptsfichier à la racine de votre projet (à partir de la documentation de Lagom Framework ):

 $ cat .jvmopts
 -Xms512M
 -Xmx4096M
 -Xss2M
 -XX:MaxMetaspaceSize=1024M
Mike
la source
1
Cela devrait être marqué comme la bonne réponse car il permet également les paramètres par projet.
mgd