web-dev-qa-db-fra.com

Comment empêcher Java.lang.OutOfMemoryError: l'espace PermGen à Scala?

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.

79
BumbleGee

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.

46
Alexey Romanov

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.

99
michaelliu

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 .

36
Tvaroh

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é.

5
Alex Stewart

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.

4
Ivan

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
2
Jonik

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.

2
niebo

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"
0
KARTHIKEYAN.A