J'ai remarqué un comportement étrange de mon scala compilateur. Il lance parfois une OutOfMemoryError lors de la compilation d'une classe. Voici le message d'erreur:
[info] Compiling 1 Scala source to /Users/gruetter/Workspaces/scala/helloscala/target/scala-2.9.0/test-classes...
Java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: Java.lang.OutOfMemoryError: PermGen space
Cela ne se produit que de temps en temps et l'erreur n'est généralement pas levée lors de l'exécution de la compilation suivante. J'utilise Scala 2.9.0 et compile via SBT.
Quelqu'un at-il une idée de ce qui pourrait être la cause de cette erreur? Merci d'avance pour vos idées.
La cause de OutOfMemoryError: PermGen space
est qu'il n'a pas assez espace de génération permanent :) Si vous utilisez Oracle JVM, vous devez ajouter le -XX:MaxPermSize=256M
(ou une autre quantité d'espace) argument à votre script sbt
. Pour les autres JVM, consultez leur documentation.
J'utilise HomeBrew pour installer sbt sur OS X. Il prend en charge un SBT_OPTS
argument qui peut être mis dans ~/.sbtconfig
fichier avec export SBT_OPTS=-XX:MaxPermSize=256M
.
J'ai supposé que vous utilisez sbt 0.13.6 ou supérieur. Créer .sbtopts
fichier dans la racine de votre projet sbt avec le contenu suivant:
-J-Xmx4G
-J-XX:MaxMetaspaceSize=1G
-J-XX:MaxPermSize=1G
-J-XX:+CMSClassUnloadingEnabled
MaxMetaspaceSize
est pour Java 8 alors que MaxPermSize
est pour Java 7. Ils sont essentiels pour éviter les erreurs de mémoire insuffisantes liées soit à permgen ou metaspace épuisement. Bien sûr, envisagez d'adapter les valeurs d'indicateur ou d'ajouter tout autre indicateur requis.
Plus de détails et d'autres approches peuvent être trouvés dans ce article de blog .
J'ai eu ce problème, j'ai joué avec pendant 10 minutes en regardant des sites essayant de changer la taille de la mémoire.
Il s'avère que je l'ai résolu par,
user-profile$ sbt
Alors,
sbt-project-name 0.1> clean
Cela m'a éclairé.
Cela ressemble à une fuite de mémoire dans SBT pour moi car dans mon cas, le programme se compile et s'exécute avec succès pendant environ 3-5 fois avant de frapper l'exception qui est fixée par le redémarrage de SBT.
La solution la plus adéquate semble en effet être -XX:MaxPermSize=
Paramètre JVM comme le suggère Alexey Romanov ou redémarrer SBT périodiquement si cela aide.
Mais il existe une autre façon intéressante: essayez de passer à Java 8 . AFAIK il n'utilise plus PermGen et est probablement à l'abri de cette exception de cette façon.
J'espère toujours que les auteurs de SBT aborderont ce problème dans les futures versions.
Utilisant à l'origine une commande comme:
Java -jar /path/to/sbt-launch.jar test
J'ai obtenu le premier OutOfMemoryError: espace PermGen que j'ai résolu en utilisant -XX:MaxPermSize
, puis OutOfMemoryError: espace de tas Java, auquel -Xmx
était le remède.
Donc dans mon cas, une commande comme celle-ci a fonctionné:
Java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test
Je construis avec le plugin Jenkins sbt et j'ai eu les mêmes problèmes. Ils ont été résolus après avoir copié le SBT_OPTS du fichier sbt vers les indicateurs JVM de la configuration de travail Jenkins.
changer le bloc de code suivant dans le fichier sbt.sh et enregistrer son bon fonctionnement.
get_mem_opts () {
local mem=${1:-1536}
local perm=$(( $mem / 4 ))
(( $perm > 256 )) || perm=1024 //256 to 1024
(( $perm < 1024 )) || perm=2048 // 1024 to 2048
local codecache=$(( $perm / 2 ))
echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m"
}
o
utilisation du terminal pour exporter la configuration sbt
export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"