java memory-management jvm permgen

java memory model



Significado de PermGen Space (4)

¿Cuál es la importancia del espacio PermGen en Java?


La generación permanente contiene metadatos que describen clases de usuario (clases que no son parte del lenguaje Java).

Las aplicaciones con gran código base pueden llenar este segmento del montón que causará java.lang.OutOfMemoryError: PermGen . Esto no se ve afectado por la configuración -Xmx o la cantidad de memoria que tiene en la máquina. Para establecer un nuevo tamaño inicial, use -XX:PermSize=64m . Para establecer un tamaño máximo, use -XX:MaxPermSize=128m


Lo único que realmente necesita saber es que el espacio PermGen está separado del montón general y no se ve afectado por el parámetro -Xmx VM. Si tiene una aplicación que carga muchas definiciones de clases (como un servidor de aplicaciones o un IDE), entonces puede establecer el tamaño del espacio PermGen usando la -XX:MaxPermSize VM.


PermGen es específico para máquinas virtuales que tienen una recolección de basura generacional.

Si usas, por ejemplo, JRockit, el "significado de PermGen" es inexistente porque JRockit no tiene ese concepto.

Solía ​​ser común, hace unos años, cuando comenzaron a aparecer los extraños errores "fuera de PermGen space" y que nadie sabía aún de quién era la falla (Tomcat + Hibernate + Sun VM solía activar esto) para reemplazar uno de los componentes (hoy en día se entienden los problemas, pero hace años, cuando comenzaron a cosechar, era casi imposible encontrar información sobre esto). Puede reemplazar Tomcat con Resin o Sun VM con JRockIt, etc.

Creo que es importante señalar que PermGen no es parte de las especificaciones de Java y solo un detalle de implementación de (bastante) algunas máquinas virtuales.


El espacio PermGen está reservado para objetos a largo plazo, en su mayoría objetos Class cargados por el ClassLoader . PermGen no se recolectará como basura excepto en circunstancias muy especiales (específicamente, cuando el ClassLoader que cargó esas clases queda fuera del alcance).

Esta es una optimización de recolección de elementos no utilizados: si los objetos que no esperamos recolectar como basura se almacenan por separado, se compacta el espacio donde se almacenan el resto de los objetos, lo que genera menos trabajo para el recolector de basura.