¿Cómo analizar los contenidos de PermGen?

Quiero obtener un vertedero del PermGen para ver por qué se está llenando. ¿Hay alguna forma de analizar esto? Ya sé sobre los sospechosos comunes como log4j, la recarga de webapp de tomcat, etc., pero también tengo un código de generación proxy personalizado en mi aplicación, y solo quiero mirar debajo del capó.

¿Es esto posible de alguna manera?

El PermGen normalmente consta del grupo literal de cadena y las clases cargadas. Para responder a parte de su problema, es decir, el conjunto literal de cadenas, escribí una utilidad para imprimir el conjunto literal de cadenas de una JVM en ejecución. Está disponible aquí:

https://github.com/puneetlakhina/javautils/blob/master/src/com/blogspot/sahyog/PrintStringTable.java

Se basa en PermStat , que es la clase utilizada para imprimir estadísticas permgen mediante la herramienta jmap.

Puedes usar las banderas:

-XX:+TraceClassLoading -XX:+TraceClassUnloading 

Imprimen las identidades de las clases a medida que se cargan / descargan de la generación permanente. Si agrega -XX:+PrintGCDetails también puede rastrear el tamaño del permgen.

Tenga en cuenta que no estoy seguro de que las banderas sean compatibles con JVM que no sean de Sun.

Otro sospechoso de errores de memoria extra de PermGen es el interrogatorio de cadenas . Compruebe los lugares donde interne cadenas en su código.

Si está buscando obtener una lista de todas las clases cargadas, puede usar jconsole . Haga clic en la pestaña de clases y luego haga clic en “Verbose Output”. Eso imprimirá cada clase que está cargada en stdout . Encontré esto muy útil rastreando un problema de clase de proxy JAXB.

Es posible que deba iniciar su aplicación con la opción de línea de comando -Dcom.sun.management.jmxremote para que jconsole pueda conectar a ella.

Will jmap -permgen ajusta a la ley?

Consulte la guía de solución de problemas para Java http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html#gbyuu