Comment spécifier la taille maximale du tas JVM «-Xmx» pour exécuter une application avec l'action «exécuter» dans SBT?

98

Mon application traite de grands tableaux de données et a besoin de plus de mémoire que la JVM n'en donne par défaut. Je sais qu'en Java, il est spécifié par l'option "-Xmx". Comment configurer SBT pour utiliser une valeur "-Xmx" particulière pour exécuter une application avec l'action "Exécuter"?

Ivan
la source

Réponses:

17

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)
    })
}
Arne
la source
53
Ceci est obsolète, vous pouvez maintenant l'utiliserjavaOptions += "-Xmx1G"
iwein
1
@iwein le contenu de mon message vous semble très important.
Arne
2
Notez que cela javaOptionsn'a d'effet que pour les JVM fourchus (voir scala-sbt.org/0.13/docs/Forking.html )
Yar
1
Ajouter fork in run := ture permetjavaOptions
coanor
@coanor cette réponse est pour une ancienne version de sbt. Il y a une réponse avec des classements beaucoup plus élevés juste sous celui-ci. Cette réponse était la bonne réponse au moment où la question a été posée.
Arne
113

Pour les processus fourchus, vous devriez regarder Build.scala

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

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

Cela vous donnera les options appropriées 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 non fourchus , il est plus pratique de définir la configuration via sbtoptsou en sbtconfigfonction de votre version sbt.

Depuis sbt 0.13.6 .sbtconfigest obsolète . Modifiez en /usr/local/etc/sbtoptssuivant 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 .sbtoptsfichier à la racine de votre projet SBT en utilisant la même syntaxe que dans le /usr/local/etc/sbtoptsfichier. Cela rend le projet autonome.

Avant sbt 0.13.6, vous pouviez 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 jvm correctes pour empêcher MOO (à la fois 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 actuelle de sbt, vous pouvez l'utiliser env SBT_OPTS=".." sbtcomme suggéré par Googol Shan. Vous pouvez également utiliser l'option ajoutée dans la société SBT 12: sbt -mem 2048. Cela devient compliqué pour les listes d'options plus longues, mais cela peut aider 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 pouvez avoir une fuite réelle sur PermGen, qui finit par forcer un redémarrage.

iwein
la source
@iwein - Les javaOptions n'ont pas changé l'espace de tas par défaut pour sbt. J'ai vérifié dans jconsole et il montre juste -Xmx512M. Même si j'ajoute le SBT_OPTS dans ~ / .sbtconfig, j'obtiens toujours ceci dans jconsole: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC. Voyez-vous le Xmx512 à l'avant? Il ne choisit pas les javaOptions de Build.scala. Des pointeurs?
Anand
@Anet peut-être que les choses fonctionnent légèrement différemment dans la version 0.13? Je mettrai à jour la réponse si je rencontre quelque chose (cela peut prendre un certain temps), faites-moi savoir si vous le comprenez entre-temps.
iwein
@iwein J'ai juste utilisé ce qui suit dans mon Build.scala et cela a fonctionné. fork en cours d'exécution: = true, javaOptions en exécution ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC"). Voir cet article pour la réponse stackoverflow.com/questions/27372468/… . Merci!
Anand
2
Pour info, vous pouvez également créer un .sbtoptsfichier à la racine de votre projet SBT en utilisant la même syntaxe que dans le /usr/local/etc/sbtoptsfichier. Cela rend votre projet autonome, ce qui peut être très pratique dans les situations CI.
Âge Mooij le
Sous Windows utilisant 0.13.9 (peut être 0.13.6), le fichier est C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt. Par défaut, le fichier contenait "-Xmx512M" sans le -J affiché dans cette réponse. Je peux confirmer que ce fichier est lu par le fait que l'assembly sbt émet un avertissement concernant -XX: MaxPermSize et lorsque je change cette valeur, l'avertissement montre la valeur que j'ai entrée et non la valeur "256m" qu'elle a affichée à l'origine.
Night Owl
69

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

$sbt -mem 2048 
Prashant Sharma
la source
5
sur win 8.1, cette commande n'a pas fonctionné pour moi:Not a valid command: mem (similar: set)
Kevin Meredith
43

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

env JAVA_OPTS="-Xmx512m" sbt run

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

Googol Shan
la source
1
Merci beaucoup. Une commande cool à savoir. Je n'ai jamais connu cet "env" et j'ai manqué un tel outil à plusieurs reprises.
Ivan
4
Hmm, cela n'a pas fonctionné pour moi! J'avais besoin de la override def forksolution ci-dessus. (sbt 0.7.7)
Scott Morrison
2
il est possible que votre fichier sbt spécifie ses propres JAVA_OPTS, auquel cas ceux-ci seront écrasés. Vous pouvez alors simplement modifier directement votre fichier sbt, soit pour supprimer l'indicateur -Xmx, soit pour le changer à la taille de tas maximale souhaitée.
nnythm
23

.sbtconfigest obsolète à partir de SBT 0.13.6. Au lieu de cela, j'ai configuré ces options /usr/local/etc/sbtoptsde 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
Om Nom Nom
la source
1
-J-Xss1Mest un peu faible pour les grandes classes de cas, 4M semble être plus sûr.
Marius Soutier
7

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

JAVA_OPTS='-Xmx512m'

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

Synesso
la source
7

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

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

Les nouvelles versions de sbt ont une option "-mem".

Brett
la source
5

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

Pete Neisen
la source
1
@UwePlonus répond à la question.
VasiliNovikov
3

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

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

javaOptions += "-Xmx1G"

À partir du shell sbt, vous pouvez exécuter show javaOptions pour voir les valeurs définies.

Sajive Kumar
la source
1
    javaOptions in Test += "-Xmx1G"

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

VasiliNovikov
la source
1
où est cet ensemble dans le build.sbt?
javadba
N'importe où, si vous avez un projet à 1 module. L'ordre des définitions n'a généralement pas d'importance dans SBT. Si vous avez plusieurs modules, spécifiez-le sur certains d'entre eux ou, si vous le souhaitez, globalement via javaOptions in ThisBuild += "-Xmx1G"oujavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov