2009-04-03 24 views
16

Tengo una aplicación Grails que hace una cantidad bastante decente de creación y destrucción de objetos de dominio, y parece que se está quedando sin espacio PermGen a un ritmo muy, muy rápido. Hice los ajustes habituales (tope PermGen a 256M, habilitado clase GC, etc.), pero no dados.Solución de problemas Grails/Groovy memory leaks?

¿Alguien podría recomendar algunas herramientas (y afortunadamente gratuitas o de bajo costo) para solucionar este tipo de consumo de memoria en Groovy y/o Java? ¿O algunas técnicas que utiliza para solucionar problemas de memoria JVM?

Editar: Esto es cuando la aplicación se implementa dentro de Tomcat en modo de producción; No lo he intentado con otros contenedores. Aun así, sería bueno tener algunos recursos para rastrear el problema.

+2

cómo acabaste resolver su problema?Usamos búsquedas y cuarzo (entre otros complementos) y vemos que nuestro uso del espacio PERMGEN aumenta con casi todas las solicitudes. – hvgotcodes

Respuesta

1

YourKit es una buena herramienta que he usado varias veces para diagnosticar problemas de memoria. Es comercial, pero tiene una versión de evaluación gratuita disponible para la depuración de un solo disparo.

1

¿El problema que está teniendo ocurre en el desarrollo o la producción?

Si está en desarrollo, recuerde que Grails constantemente recompila muchos aspectos de su aplicación (no solo los cambios de Dominio, pero el controlador cambia, y otras clases también). También tengo problemas con PermGen, pero la mayoría se desencadena por la constante compilación de los archivos en los que estoy trabajando. Puede desactivar esta función

http://www.grails.org/FAQ#Q:%20OMG%20I%20get%20OutOfMemoryErrors%20or%20PermGen%20Space%20errors%20when%20running%20Grails%20in%20development%20mode.%20What%20do%20I%20do?

Si está en producción, obviamente tiene un problema mucho más crítico. Los problemas de memoria de PermGen se atribuyen a muchos de los marcos en los que se basa Grails, incluidos Spring, Hibernate e incluso la propia JVM de Sun. Podría tratar de ajustar el tamaño máximo de almacenamiento dinámico para su contenedor web (Tomcat o Jetty).

También podría intentar una implementación diferente de la JVM, como Oracle JRockit, que se supone que es considerablemente mejor en la recolección de basura y otros medios de eficiencia. Nunca lo intenté yo mismo, pero dado que yo también estoy en el medio del desarrollo y el extenso proyecto de Grails, puedo estar comprando soluciones a estos problemas yo mismo. ¡Buena suerte!

+0

JRockit es un producto de Oracle http://www.oracle.com/technology/software/products/jrockit/index.html –

+0

Estoy ejecutando en modo de producción en Tomcat (6.0.18), y no realmente tiene una opción sobre la JVM. –

+0

He leído que uno de los problemas con la recolección de basura en un contenedor web es que la pila solo se actualiza realmente cuando se reinicia el contenedor. (Reiniciar el contenedor equivale a reiniciar el servicio Tomcat, no simplemente reiniciar una sola aplicación web). –

6

Me gusta personalmente VisualVM. Definitivamente hay herramientas más potentes, pero esta tiene una buena relación de usabilidad-potencia.

0

Si esto ocurre después de volver a implementar su aplicación varias veces, puede verse afectado por this Grails bug. El Tomcat FAQ también tiene varias causas posibles para las fugas de PermGen.

+0

Creo que ese es el problema raíz (la aplicación funciona bien en Jetty), pero aun así me gustaría tener un buen recurso. en el futuro para hacer este tipo de depuración. –

10

Ha intentado

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

?

Junto con el aumento de los sospechosos habituales (-Xmx, -Xms, -XX:PermSize y -XX:MaxPermSize) esta resuelto todos los problemas PermGen en nuestra producción de Tomcat, que se había producido muy pronto después de desplegar la aplicación. Nunca he visto otra OOM-Exception después de eso. :-)

+1

problemas relacionados con el rendimiento con esta solución? Estamos utilizando los complementos de búsqueda, auditables y de cuarzo con muchos trabajos recurrentes y obtenemos un PermGen OOM todas las semanas ... – hvgotcodes

Cuestiones relacionadas