java.lang.OutOfMemoryError: espace PermGen
À tous/fermer les électeurs : je sais que c'est une copie exacte de nombreuses questions, mais j'ai essayé beaucoup de réponses et encore face à des questions donc ajouté une nouvelle question.
Question:
J'utilise eclipse helios et Tomcat 6 pour mon printemps et
java.lang.OutOfMemoryError: PermGen space
CHAQUE FOIS QUE JE DEBUG MA DEMANDE
J'ai essayé
1) Ajout de
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
-XX:MaxPermSize=1204m
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
à eclipse.ini
2) la Création d' setenv.sh
et setenv.bat
dans tomcat_home/bin
avec le contenu suivant
set JAVA_OPTS="-Xms256m -Xmx512m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
3) de l'exécution Manuelle garbage collector dans eclipse. J'ai activé cette option par
Window -> Preferences -> General -> and select always run in background and show heap status
4) Redémarrer Tomcat centaine de fois.
5) Redémarrer eclipse et parfois le redémarrage de mon ordinateur, lorsque la frustration va au-delà de la limite..
La meilleure partie est que j'ai toujours l'erreur.
Est-il une solution que je devrais essayer ?
EDIT :
J'ai essayé de lancer une autre application et reçois toujours la même erreur à mon humble avis, ma demande est trop faible pour provoquer une erreur et mon application est en cours d'exécution fine sur mes collègues de l'installation.
source d'informationauteur xyz
Vous devez vous connecter pour publier un commentaire.
Vos 3 premières options de la cible de 2 différentes machines virtuelles java. Options #1 et #3 modifier eclipse instance de la JVM, c'est la JVM de la gestion de votre IDE. Option #2 modifie le Tomcat instance de la JVM. C'est pourquoi vous voyez deux
java.exe
fichiers dans votre gestionnaire de tâches (dans le cas de windows) lors du démarrage d'eclipse et Tomcat (en supposant que ceux-ci sont les seules applications Java en cours d'exécution).Il est important de comprendre que le Tomcat plugins fournis par eclipse WTP (dans mon cas Indigo) ne pas appel à l'externe (OS dépendante) les scripts de démarrage/arrêt de Tomcat. Au lieu de cela ils pondent sur le Tomcat JVM directement via la ligne de commande (
java.exe ...
). Si vous souhaitez modifier les paramètres de la JVM pour Tomcat cas, vous démarrez à partir d'eclipse, il est nécessaire de modifier laRun Configuration
. Essayez de modifier les paramètres de la JVM là, il devrait fonctionner (voir capture d'écran).Essayer
set JAVA_OPTS=-XX:NewSize=128m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+DisableExplicitGC -Xms512m -Xmx1536m
Quels outils avez-vous utilisé pour le profil de votre application en cours d'exécution? Je recommande d'utiliser eclipse mat, bien que jconsole et visualvm sont disponibles avec le jdk.
Ne vous chargez beaucoup de classes dans votre application, quelque part dans une boucle?
Comment à propos des chaînes? quelle est la taille de la chaîne de la piscine?
Je suis désolé, mais le redémarrage de tomcat, eclipse ou la machine ne va pas résoudre le problème; vous aurez besoin de faire connaître et d'analyser votre demande de résoudre le problème. Prendre un heap dump (vous pouvez utiliser jmap) et à analyser.
Je voudrais ajouter -XX:PermSize=1024m dans la variable JAVA_OPTS, car l'erreur peut venir de Tomcat.
Je ne suis pas familier avec l'éclipse.fichier ini.
Je ne connais pas les détails à propos de
eclipse.ini
mais je pensais que c'était juste pour définir des indicateurs lors du démarrage de l'Éclipse elle-même. Sans impact sur l'exécution/débogage des applications. Personnellement, à chaque fois que je veux modifier les paramètres lors de l'exécution/débogage d'une application, j'ai tout simplement ajouter de la JVM des drapeaux dans l'exécution/débogage de configuration.En outre, si vous utilisez plus de 1 giga de perm de l'espace, je pense qu'il y a quelque chose qui cloche dans le code.
Essayez de localiser la source de la région de perm de la consommation d'espace et de le corriger. Je ne dis pas que ça va être facile, mais ça va être nécessaire pour que l'application fonctionne correctement. ...sauf si 1 giga de perm espace est vraiment prévu, mais j'ai quelques doutes à ce sujet.
Ce que vous pouvez rechercher par exemple
string.intern()
. Si vous effectuez cette opération sur chaque demande d'entrée//que ce soit pour des chaînes arbitraires, vous aurez inutilement de remplir votre perm de l'espace, puisqu'il sera de conserver en permanence une copie de la chaîne.Pour moi
-Xmx1024m -XX:MaxPermSize=256m
a fait le tour.