2009-01-23 15 views
19

Sigo recibiendo un error "PermGen" en mi servidor Tomcat 6."PermGen" recurrente en Tomcat 6

Sé qué aplicación está causando el problema, pero no estoy seguro de por qué lo está haciendo. La aplicación utiliza MySQL 5 y se ejecuta en JDK 6.

¿Existen herramientas/sugerencias para diagnosticar o analizar los problemas subyacentes con la aplicación específica?

Gracias

+0

Es éste un problema diferente que la que [descrito aquí] (http://stackoverflow.com/questions/1124131/what-can-be-done -with-permgen-out-of-space-exception-in-tomcat-spring-hibernate? –

+0

Recomiendo leer [este artículo] (http: // plumbr.eu/blog/what-is-a-permgen-leak) (escrito por mí), para comprender mejor por qué pueden ocurrir estos errores. Y contiene algunas sugerencias para resolverlos también. – Nikem

Respuesta

25

El PermGen se utiliza para almacenar las definiciones de clase y el grupo de cadena internados. Su código podría estar llenándolo (si llama a un interno innecesariamente), pero lo más probable es que el valor predeterminado sea demasiado pequeño para su aplicación.

Esto se debe a que Tomcat cargará nuevas clases cada vez que implemente un WAR - o, si está trabajando en un entorno de desarrollo, cada vez que edite un JSP. Esos eventualmente deberían limpiarse, pero en un entorno de desarrollo activo puede tener períodos en los que se carguen instancias antiguas y nuevas. O bien, si se encuentra en un entorno de producción y tiene una gran aplicación web, es posible que simplemente necesite más espacio.

Para ajustar el tamaño PermGen, utilice -XX:MaxPermSize=SIZE

Los siguientes enlaces pueden ser útiles: tuning GC (esta es la edición 1.5), GC FAQ (1.4.2 edición), Hotspot VM options (creo que esto es 1.6)

+0

Gracias por la respuesta, examinaré todas sus sugerencias. –

+0

Dado que esto se tocó hoy (gracias a quien subió de categoría), aquí hay otro enlace sobre el diagnóstico de OOM (escrito por mí): http://www.kdgregory.com/index.php?page=java.outOfMemory – kdgregory

2

Creo que es posible que tenga muchos JSP en su aplicación. Existe un problema conocido en Tomcat en el que reiniciar una aplicación implementada con muchos JSP causa problemas con PermGen porque tomcat vuelve a compilar y volver a cargar todas estas clases. Aumentar el tamaño como se menciona en la publicación anterior debería ayudar.

13

Pruebe los siguientes parámetros de JVM:

-XX:+UseConcMarkSweepGC 
-XX:+CMSPermGenSweepingEnabled 
-XX:+CMSClassUnloadingEnabled 

Subiendo el espacio PermGen con -XX:MaxPermSize simplemente retrasa el problema.

Por favor, vea este comentario: How to deal with “java.lang.OutOfMemoryError: PermGen space” error

que, indirectamente, me señaló a estos dos mensajes: problem, solution

+2

Retrasa el problema si mantiene enlaces de cargador de clases accidentales. Y, para estar seguro, hay muchos casos en que esto puede suceder, y puede ser casi imposible encontrarlos a menos que conozca sus bibliotecas por dentro y por fuera (java.beans.Introspector, por ejemplo, mantiene un caché de clase datos). – kdgregory

+2

Sin embargo, a menudo el problema es simplemente que la aplicación web es demasiado grande para usar el valor predeterminado. Particularmente en un entorno de desarrollo, donde tienes 64Mb de permgen y puedes volver a implementarlo constantemente. Lleva tiempo que todas las referencias existentes salgan del alcance (por ejemplo, un hilo agrupado que cuelga del último servlet que ejecutó). – kdgregory

1

he visto un montón de errores PermGen cuando Tomcat se vuelve a cargar después de un cambio de código cuando se utiliza hibernación y primavera, creo que es debido a que las instancias de logger/ehcache no se cierran correctamente.

2

Acepto que aumentar el espacio permgen con -XX: MaxPermSize solo retrasa el problema. Traté de aumentar el permgen y después de eso comencé a recibir el mismo error después de que envié más solicitudes a mi servidor. Se sugieren indicadores adicionales como -XX: + CMSClassUnloadingEnabled, aunque disminuirá un poco el rendimiento.

3

probar esto: en las máquinas Linux

export JAVA_OPTS="-XX:PermSize=128m"

Cuestiones relacionadas