2011-10-07 18 views
30

Estoy ejecutando la aplicación web java usando Hibernate y glassfish Server. Estoy recibiendoError de espacio PermGen - Glassfish Server

java.lang.OutOfMemoryError: PermGen space excepción cuando después de implementarlo varias veces.

Intenté -XX:MaxPermSize=128M en mis variables de entorno, pero no funciona.

+0

Esto es lo que está buscando: http://stackoverflow.com/questions/1996088/java-class-permgen-memory-leak-web-applications-generic-solution – Raedwald

Respuesta

37

Esto es pérdida de memoria cargador de clases. Cada vez que vuelve a implementar la aplicación, se crea un nuevo cargador de clases y todas las clases de su aplicación se vuelven a cargar. Esto consume memoria en el espacio de generación permanente.

El antiguo cargador de clases y todas sus clases cargadas tienen que ser recogidos basura, de lo contrario eventualmente se ejecutará en un espacio de PermGen OOME después de implementar varias veces. Esto no funciona si un objeto cargado por un cargador de clases externo contiene una referencia a cualquier objeto cargado por el cargador de clases anterior. This article da una buena explicación del problema.

En general, las fugas del cargador de clases son difíciles de analizar y, a veces, difíciles de corregir. Para averiguar por qué los cargadores antiguos no son basura, debe usar un generador de perfiles. En JProfiler, use el andador de montón, seleccione los objetos de cargador de clase glassfish y use la vista de referencias entrantes para verificar las rutas a las raíces del recolector de basura.

La clase de cargador de clase se llama org.apache.servlet.jasper.JasperLoader. Aquí hay una captura de pantalla de una situación regular, donde el cargador de clases solo está en manos de instancias activas de objetos cargados.

enter image description here

En su situación, debería ver referencias de objetos externos. Otra causa común de una pérdida de cargador de clase en contenedores web es un hilo de fondo que no se detiene. Google Guice, por ejemplo, tiene un error en 3.0.

(Negación: mi empresa desarrolla JProfiler)

5

Este problema ocurre con la implementación iterativa muchas veces. Me he enfrentado a esto muchas veces. Por favor, consulte el siguiente enlace de JIRA para el bug glassfish:

http://java.net/jira/browse/GLASSFISH-587

+1

¿Ha visto el año de ese informe de errores? ?! –

46

Para resolver este problema (en el sistema operativo basado en Linux) no siguiendo

1) aumento de memoria (para que este problema no vienen con frecuencia) por configurando "dominio".xml" en

/glassfish/Dominio/domain1/config

búsqueda de

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2) matar el proceso GlassFish para liberar el puerto en el que se estaba ejecutando (en mi caso fue 8686) terminal abierto (en sistema operativo basado en Linux) y tipo -

sudo netstat -npl | grep 8686

esto se traducirá en algo así como ..

tcp6 0 0 :::8686 :::* LISTEN 3452/java

próximo uso

kill -9 3452 a matar a ese proceso (3452 en este caso)

Ahora intenta iniciar Glassfish, debería comenzar.

+0

gracias señor! ¡muy bien! –

9

Si está utilizando Windows, intente eliminar el proceso glassfish (java.exe * 32) con el Administrador de tareas y luego reinicie el servidor.

+0

Esto es perfecto –

Cuestiones relacionadas