Comment analyser le contenu de Permgen?
Question
Je veux obtenir un dépotoir du Permgen pour voir pourquoi il se remplit. Existe-t-il un moyen d'analyser cela? Je connais déjà les suspects communs comme LOG4J, le rechargement Tomcat WebApp, etc., mais j'ai aussi du code de génération de proxy personnalisé dans mon application, et je veux juste regarder sous le capot.
Est-ce possible d'une manière ou d'une autre?
La solution
Le Permgen se compose normalement du pool littéral à chaîne et des classes chargées. Pour répondre à une partie de votre problème, c'est-à-dire le pool littéral à chaîne, j'ai écrit un utilitaire pour imprimer une piscine littérale à chaîne JVM en cours d'exécution. Il est disponible ici:
https://github.com/puneetlakhina/javautils/blob/master/src/com/blogspot/sahyog/printstringtable.java
C'est basé sur Permstat, qui est la classe utilisée pour imprimer les statistiques permanentes par l'outil JMAP.
Autres conseils
Vous pouvez utiliser les drapeaux:
-XX:+TraceClassLoading -XX:+TraceClassUnloading
Ils impriment l'identité des classes lorsqu'ils sont chargés / déchargés de la génération permanente. Si vous ajoutez -XX:+PrintGCDetails
Vous pouvez également suivre la taille du permgen.
Notez que je ne suis pas sûr que les drapeaux soient pris en charge dans des JVM autres que celui de Sun.
Un autre suspect d'erreurs hors mémoire de Permgen est String Interning. Vérifiez les endroits où vous interdisez les chaînes de votre code.
Si vous cherchez à obtenir une liste de toutes les classes chargées, vous pouvez utiliser jconsole
. Cliquez sur l'onglet Classes puis cliquez sur "Sortie verbale". Qui imprimera chaque classe qui est chargée pour stdout
. J'ai trouvé ce suivi très utile dans un problème de classe proxy JAXB.
Vous devrez peut-être lancer votre application avec le -Dcom.sun.management.jmxremote
Option de ligne de commande afin de jconsole
pour s'y attacher.
Sera jmap -permgen
adapter à la loi?
Voir le guide de dépannage pour Javahttp://java.sun.com/javase/6/webnotes/trouble/tsg-vm/html/memleaks.html#gbyuu