java memory garbage-collection permgen permanent-generation

java - ¿Cómo descubro qué hay en la generación permanente?



memory garbage-collection (8)

Dado un heapdump o una VM en ejecución, ¿cómo descubro cuál es el contenido de la generación permanente? Sé sobre ''jmap -permstat'' pero eso no está disponible en Windows.


puede usar JConsole o jvisualvm.exe (con jdk 1.6 7) para encontrar qué es dónde. Si desea saber cómo se relacionan todos los objetos entre sí y el árbol de objetos, entonces puede probar Eclipse Memory Analyzer - http://www.eclipse.org/mat/ .

En resumen, obtendrá el deseo que desee de " http://www.eclipse.org/mat/ ".

Buena suerte,



¿Tienes un problema específico para resolver? El uso de String.intern () es una de las causas típicas de los problemas de permgen. Además, los proyectos con muchas clases también tienen problemas de permgen.

No sé cómo entrar en el permgen y ver qué hay allí ...


La generación permanente realmente solo contiene dos tipos de cosas: definiciones de clase y cadenas internas. Últimamente, muy rara vez le da problemas, pero a menudo se culpa de los problemas. Con mayor frecuencia, el primero es el que da problemas, debido a la generación de código y la recarga parcial parcial (referencias colgantes).

A diferencia del nombre que sugiere, Permgen eventualmente también recibe GC, simplemente no forma parte del ciclo regular de GC. Por lo tanto, las cadenas internas no referenciadas y las clases no utilizadas se limpian. Pero permgen tampoco crece de forma dinámica, lo que significa que a veces es necesario cambiar manualmente el tamaño de su configuración para el inicio de JVM.


Estoy buscando lo mismo, pero debido a las limitaciones de memoria de una plataforma integrada.

Mire el código para jmap, la herramienta permstat solo está disponible si la clase sun.jvm.hotspot.tools.HeapSummary está disponible. Esta clase es parte del agente de servicio. De acuerdo con la documentación de OpenJDK (http://openjdk.java.net/groups/serviceability/svcjdk.html#bsa):

Los componentes del agente de servicio se crean como parte de la compilación estándar del repositorio de HotSpot. Estos componentes son:

-libsaproc.so: este es el componente de código nativo de SA.

-sa-jdi.jar: Este contiene las clases de Java de SA. Incluye una implementación de JDI que permite a los clientes de JDI realizar la depuración de solo lectura en los archivos principales y los procesos bloqueados.

SA es utilizado por jinfo, jmap, jstack

NOTA: El agente de servicio y las tecnologías que lo utilizan no se incluyen actualmente en las versiones de JDK en las plataformas de Windows.

Parece ser el caso de Oracle JDK también. Estoy buscando modificar la herramienta jmap para obtener más información.


En este artículo, la Supervisión de la memoria con Java SE 5 describe cómo descubrir información sobre el uso de heap, las agrupaciones de memoria (incluido el espacio permgen) y demás. Es muy sencillo:

MemoryUsage usage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage(); long nonHeapFree = usage.getMax() - usage.getUsed(); long nonHeapTotal = usage.getMax();

En mis pruebas en OSX (Sun VM), el "uso de la memoria que no es de montón" coincide con los valores devueltos para el conjunto de permgen de cerca y presumiblemente hará algo útil en máquinas virtuales que no tienen permgen.


La generación permanente contiene el objeto de clase. Por lo tanto, debe verificar el volcado del heap u otra forma de lista de objetos para las clases. Si tiene problemas con el tamaño de la generación permanente, generalmente es causado por dos razones:

  • su programa o una biblioteca que use crea clases dinámicamente y el tamaño predeterminado de la generación permanente es demasiado pequeño - aumente el tamaño con -XX: MaxPermSize = 256m
  • su programa o una biblioteca que utiliza crea nuevas clases dinámicamente cada vez que se llama, por lo que el tamaño de la generación permanente aumenta sin parar; este es un error de programación que debe corregirlo (o buscar una solución / crear un informe de error)

Para ver cuál es su caso, verifique el tamaño de la generación permanente durante un período mayor.

Y una buena visión general sobre la generación permanente:

http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation


Una técnica que me ayudó fue utilizar la opción de línea de comandos -verbose:class en java , y obtendrá la salida de registro que le indicará a medida que las clases se cargan / descargan. Dado que las clases se cargan al permgen, esto puede ayudar en ciertas circunstancias.