web-dev-qa-db-fra.com

Comment spécifier la taille de tas maximale de la machine virtuelle Java "-Xmx" pour l'exécution d'une application avec l'action "exécuter" dans SBT?

Mon application traite de grandes baies de données et nécessite plus de mémoire que la JVM par défaut. Je sais que Java est spécifié par l'option "-Xmx". Comment configurer SBT pour qu'il utilise une valeur "-Xmx" particulière pour l'exécution d'une application avec une action "run"?

91
Ivan

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, buildCompilerJar.asFile)
    })
}
16
Arne

Pour les processus forkés, vous devriez regarder Build.scala

Pour modifier les options Java) des processus forkés, vous devez les spécifier dans le fichier Build.scala (ou ce que vous avez nommé votre construction), comme suit:

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

Cela vous donnera les options appropriées sans modifier Java_OPTS globalement, et, il mettra Java_OPTS personnalisé dans un script de démarrage généré par sbt

Pour les traitements non forkés , il est plus pratique de définir la configuration via sbtopts ou sbtconfig en fonction de votre version de sbt.

Depuis sbt 0.13.6 .sbtconfig est obsolète . Modifier /usr/local/etc/sbtopts le long de 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 .sbtopts fichier dans la racine de votre projet SBT en utilisant la même syntaxe que dans le fichier /usr/local/etc/sbtopts fichier. Cela rend le projet autonome.

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

  1. Vérifiez où sbt est:

    $ 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 jvm correctes pour empêcher le MOO (normal et PermGen):

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

Si vous souhaitez 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 à manier 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, permet de garder l’espace PermGen propre. Toutefois, en fonction des frameworks que vous utilisez, vous pourriez avoir une fuite réelle sur PermGen, ce qui forcerait éventuellement un redémarrage.

107
iwein

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

$sbt -mem 2048 
65
scrapcodes

Si vous utilisez sbt sur linux Shell, vous pouvez utiliser:

env Java_OPTS="-Xmx512m" sbt run

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

41
Googol Shan

.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
21
omnomnom

Utilisez Java_OPTS pour la configuration avec une variable d’environnement.

Utilisez les options -J-X pour définir des options individuelles, par exemple. -J-Xmx2048 -J-XX: MaxPermSize = 512

Les versions les plus récentes de sbt ont une option "-mem".

7
Brett

Il y a une façon 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.

6
Synesso

Le javaOptions += "-XX:MaxPermSize=1024" _ dans notre build.sbt, comme indiqué 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.

4
Pete Neisen

La variable d'environnement est _Java_OPTIONS, qui doit être définie. Une fois que vous avez défini _Java_OPTIONS et lorsque vous définissez sbt, sbt affichera le message à l'aide de Java_OPTIONS et des valeurs.

Vous pouvez également définir javaOption dans le fichier sbt ou .scala, par exemple.

javaOptions += "-Xmx1G"

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

3
Sajive Kumar
    javaOptions in Test += "-Xmx1G"

Ceci définit les options de la machine virtuelle Java pour les tests. Fonctionne aussi avec jvm forgeage (fork in Test := true).

1
VasiliNovikov

sbt vous permet de lister les options JVM nécessaires à l’exécution de votre projet sur un fichier nommé

.jvmopts

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

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

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

1
Ar maj