web-dev-qa-db-fra.com

Comment définir la taille du tas pour sbt?

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

  • create ForkRun class - je n'ai pas observé de processus forké lors de mon utilisation de sbt
  • définir la variable d'environnement Java_OPTS _ il est défini, mais la ligne de commande de processus de sbt ne semble pas du tout l’utiliser.
  • sbt -J-Xmx2G ajoute le paramètre à la ligne de commande du processus sbt, mais l'ancienne valeur -Xmx1536m est utilisé 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, lors des tests et de run?

80
user972946

J'ai trouvé la solution. Quelle que soit la manière dont vous spécifiez la taille de segment de mémoire JVM, cela ne fonctionnera jamais car l'exécutable SBT le remplace déjà.

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

Retirer le - ligne.

Désormais, lorsque vous exécutez SBT, vos paramètres de taille de segment de mémoire JVM ne seront plus remplacés. 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

20
user972946

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"

UPDATE: Pour obtenir votre espace de mémoire 2G, vous pouvez utiliser ceci:

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

REMARQUE: SBT DOIT ÊTRE DERNIÈRE VERSION

Les anciennes versions de sbt contiennent des bogues qui remplacent ces paramètres, utilisez brew upgrade sbt pour la dernière sbt pour Mac (en supposant que l’installation est prévue) (IDK pour Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848

90
Noah

Depuis mars 2015, si vous utilisez sbt sur OSX avec Homebrew, vous devez éditer le fichier /usr/local/etc/sbtopts

par exemple.

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

"sbt -mem 23000 run" fonctionne pour moi.

40
GBY

Sous Windows, pour sbt 0.13.9.2, vous devez définir Java_OPTS aux options JVM que vous voulez.

> set Java_OPTS=-Xmx1G
> sbt Assembly

Le sbt.bat Le script charge ses valeurs par défaut de conf\sbtconfig.txt en CFG_OPTS mais utilisera Java_OPTS à la place si 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 %*
15
Choy

Je cherchais à résoudre un problème de ce type sous Mac OS X avec une installation homebrew de SBT. Si vous avez installé SBT via homebrew, vous êtes en clair depuis le /usr/local/bin/sbt fichier 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 dans SBT_OPTS collera (votre -Xmx aura la priorité). De plus, la première ligne du script exécutera toutes les commandes de ~/.sbtconfig si elle existe, il peut être préférable d’utiliser vos options SBT si vous les jouez un peu. Vous n'aurez pas à source ~/.bash_profile chaque fois que vous apportez une modification à SBT_OPTS

11
Adrian Rodriguez

Si vous utilisez sbt à partir de PowerShell, définissez le paramètre SBT_OPTs variable d’environnement, comme ceci:

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

Puis lancez:

sbt
6
sungiant

Pour SBT version 1.0.4 sous Windows la valeur par défaut les paramètres JVM proviennent de sbt\conf\sbtconfig.txt fichier. Modifiez simplement les valeurs ici. Changement -Xmx512M à -Xmx2048M.

Ce n'est pas la seule source d'options JVM pour SBT. D'autres peuvent être trouvés en inspectant sbt.bat. Un moyen simple de diagnostiquer l’origine des paramètres consiste à commenter cette ligne dans un fichier de commandes: @echo off.

4
Jarekczek

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

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

Dans mon cas, la configuration de mon service remplaçait la variable d’environnement SBT_OPTS et Java_OPTS. J'ai pu définir les limites en définissant dans mon build.sbt le suivant:

javaOptions in Universal ++= Seq(
  "-J-Xms1g",
  "-J-Xmx2g")

Référence: https://www.scala-sbt.org/sbt-native-packager/archetypes/Java_app/customize.html

0
Cassio