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](https://i.stack.imgur.com/B6u2Q.png)
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)
Esto es lo que está buscando: http://stackoverflow.com/questions/1996088/java-class-permgen-memory-leak-web-applications-generic-solution – Raedwald