2010-01-03 6 views
13

Tengo una pérdida de memoria de perm gen, eso lo sé. La creación de perfiles utilizando jvisualvm muestra que al realizar una implementación en caliente (por ejemplo, detener e iniciar una aplicación sin matar a la JVM, en tomcat, WebSphere, WebLogic, etc.), el espacio de PermGen aumenta constantemente.Clase de Java (PermGen) Pérdida de memoria (aplicaciones web) - ¿Solución genérica?

Después de leer, usando jhat y otras herramientas avanzadas me di cuenta de que probablemente tenga una referencia al WebAppClassLoader de una clase en algún lugar de sus cargadores de clase primaria.

no podía precisarlo a pesar de que hice algunas consultas masivas basadas en JavaScript jhat

no hay una sencilla utilidad que se entera de quién es el responsable de que el cargador de clases a no ser recolector de basura (por lo tanto permitiendo la recolección de basura de clases cargadas por él)?

me trataron JProfiler, jvisualvm, jhat, y un montón de Google

a todos los amigos LMGTFY - He pasado alrededor de un día y medio de la lectura de foros con instrucciones paso a pasos, sin suerte. Estoy buscando una utilidad o código que emita:

El objeto X de la clase Y es la única raíz de GC que evita que se eliminen sus clases.

+0

¿qué información le dio JProfiler? ¿Qué objetos quedan cuando llamas explícitamente al recolector de basura? – Bozho

+0

y cómo estás haciendo un despliegue caliente (en tomcat)? – Bozho

+0

@Bozho - usando Tomcat Manager, presionando detener/iniciar. Los objetos que quedan son WebAppClassLoader y todas sus clases cargadas. la búsqueda de raíz de GC más cercana no dio resultados prácticos. –

Respuesta

11

Hay una solución insatisfactoria pero fácil: No despliegue en caliente en entornos de producción. Puede configurar un clúster de dos contenedores de servlets y actualizarlos de uno en uno con un reinicio.

+1

Este es un patrón bastante común para las arquitecturas de implementación de alta disponibilidad. –

+0

Entonces, ¿cómo convencer al cliente? ¿Hay un libro blanco que describa este patrón? –

+2

Esta no debería ser la respuesta aceptada. Estoy teniendo el mismo problema en un entorno de prueba local, y realmente me gustaría evitar reiniciar Tomcat si puedo. – ripper234

5

Las realidades de las redespliegues frecuentes ... Lo mejor que puedes hacer es aumentar el tamaño de la perm gen usando -XX: MaxPermSize = 256m. Esto puede comprarle redespliegues más por reinicio de jvm. O siga leyendo en http://my.opera.com/karmazilla/blog/2007/03/15/permgen-strikes-back

Tenga en cuenta que si los cargadores de clases no pueden ser gc-ed en absoluto, jugando con el JVM no ayudará en absoluto. Es mejor que te olvides de los despliegues frecuentes, especialmente en producción, para dev es útil, sin embargo.

+0

Lo tenemos ya en 256, permite alrededor de 4 a 5 implementaciones –

Cuestiones relacionadas