Comment spécifier la taille de stack maximale de la JVM «-Xmx» pour exécuter une application avec une action «run» dans SBT?

Mon application effectue le traitement de grands tableaux de données et nécessite plus de mémoire que JVM par défaut. Je sais en Java que c’est spécifié par l’option “-Xmx”. Comment définir SBT pour utiliser une valeur “-Xmx” particulière pour exécuter une application avec une action “run”?

Essaye ça:

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, buildComstackrJar.asFile) }) } 

Pour les processus fourchus, vous devriez regarder Build.scala

Pour modifier les options java des processus forkés, vous devez les spécifier dans Build.scala (ou ce que vous avez nommé votre build) comme ceci:

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

Cela vous donnera les bonnes options sans modifier globalement JAVA_OPTS, et cela mettra JAVA_OPTS personnalisé dans un script de démarrage généré par sbt.

Pour les processus sans fourche , il est sbtopts configurer la configuration via sbtopts ou sbtconfig fonction de votre version de sbt.

Depuis sbt 0.13.6 .sbtconfig est obsolète . Modifiez /usr/local/etc/sbtopts suivant ces lignes:

 -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 

Vous pouvez également créer un fichier .sbtopts à la racine de votre projet SBT en utilisant la même syntaxe que dans le fichier /usr/local/etc/sbtopts . Cela rend le projet autonome.

Avant sbt 0.13.6, vous pouvez définir les options dans .sbtconfig pour les processus non fourchus :

  1. Vérifiez où se trouve sbt:

     $ which sbt /usr/local/bin/sbt 
  2. Regardez le contenu:

     $ 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. Définissez les options correctes de JVM pour empêcher le MOO (régulier et PermGen):

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

Si vous voulez définir SBT_OPTS uniquement pour l’exécution courante de sbt, vous pouvez utiliser env SBT_OPTS=".." sbt comme suggéré par Googol Shan. Ou vous pouvez utiliser l’option ajoutée dans Sbt 12: sbt -mem 2048 . Cela devient difficile à gérer pour des listes d’options plus longues, mais cela peut être utile si vous avez différents projets avec des besoins différents.

Notez que CMSClassUnloadingEnabled, de concert avec UseConcMarkSweepGC, aide à garder l’espace PermGen propre, mais en fonction des frameworks que vous utilisez, vous risquez d’avoir une fuite réelle sur PermGen, qui finit par forcer le redémarrage.

Dans sbt version 12, il existe une option pour cela:

 $sbt -mem 2048 

Si vous exécutez sbt sur le shell Linux, vous pouvez utiliser:

 env JAVA_OPTS="-Xmx512m" sbt run 

Ceci est ma commande habituellement utilisée pour exécuter mon projet sbt.

.sbtconfig est obsolète à partir de SBT 0.13.6 . Au lieu de cela, j’ai configuré ces options dans /usr/local/etc/sbtopts de la manière suivante:

 -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 

Il y a un moyen que je connaisse. Définissez la variable d’environnement JAVA_OPTS.

 JAVA_OPTS='-Xmx512m' 

Je n’ai pas trouvé de moyen de le faire en tant que paramètre de commande.

Utilisez JAVA_OPTS pour définir avec la variable d’environnement.

Utilisez les options -JX pour sbt pour des options individuelles, par exemple -J-Xmx2048 -J-XX: MaxPermSize = 512

Les nouvelles versions de sbt ont une option “-mem”.

Le javaOptions += "-XX:MaxPermSize=1024" dans notre build.sbt référencé par @iwein ci-dessus a fonctionné pour nous lorsque nous voyions une erreur java.lang.OutOfMemoryError lors de l’exécution des tests Specs2 via sbt.

La variable d’environnement est _JAVA_OPTIONS, qui doit être définie. Une fois que vous avez défini _JAVA_OPTIONS, et que vous avez sbt, sbt affiche le message en utilisant JAVA_OPTIONS et les valeurs.

Sinon, vous pouvez définir javaOption dans le fichier sbt ou .scala, par exemple

 javaOptions += "-Xmx1G" 

Depuis le shell sbt, vous pouvez lancer show javaOptions pour voir les valeurs définies.

  javaOptions in Test += "-Xmx1G" 

Cela définit les options JVM pour les tests. Fonctionne également avec jvm forking ( fork in Test := true ).

sbt vous permet de lister les options JVM dont vous avez besoin pour exécuter votre projet sur un fichier nommé

.jvmopts

à la racine de votre projet. puis ajoutez les options Java que vous voulez

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

il est testé et fonctionne dans Windows 10 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html