2009-02-19 11 views

Respuesta

1

Esto no es normal, y probablemente sea indicativo de memory leak.

Debería intentar usar un memory profiler para ver dónde se está filtrando su aplicación.

En general, debe buscar bucles u operaciones repetidas donde se crean objetos pero no disposed of correctamente.

+0

Esto es normal para la JVM del servidor. –

+1

@sjbotha: El crecimiento continuo es definitivamente/no/normal. – GEOCHET

+0

Creo que depende si es un crecimiento continuo sin límites o no –

0

Puede tener una pérdida de memoria. Primero conectaría jconsole a su aplicación para determinar si es un espacio permgen o solo un montón de memoria y luego procedería a descubrir dónde está la fuga. ¿Puedes darnos más información? ¿Qué está sucediendo en su aplicación a medida que crece la memoria?

Si es relativamente nuevo en el diagnóstico de este tipo de problema, recomendaría jprofiler. Puede descargar una versión de prueba totalmente funcional y tomar instantáneas de memoria para ver qué objetos hay en la memoria. Puede usar esta información para descubrir qué objetos son la fuente de la fuga.

+0

Esta aplicación se ha ejecutado durante años. Recientemente, encontré este problema, porque el sitio web está funcionando muy lento. Me pregunto si alguien cambió la configuración. No creo que haya una pérdida de memoria ya que nadie cambia los códigos. – user68461

9

Si solo crece, entonces se trata de una pérdida de memoria. Pero si crece hasta su montón máximo, luego cae, entonces ese es el comportamiento normal de recolección de basura. Hay muchas herramientas que puede usar para aprender más. Una de las más simples es conectarse con JConsole (parte del JDK) y observar su montón a lo largo del tiempo.

También puede consultar la información de recolección de elementos no utilizados con varios parámetros y parámetros como -verbose: gc para comenzar.

Si desea diagnosticar pérdidas de memoria, hay una serie de excelentes herramientas disponibles, incluyendo varios libres que funcionan con Eclipse, NetBeans, IntelliJ, etc.

5

El comportamiento predeterminado de Sun "servidor" hotspot para agrandar el montón en lugar de borrar SoftReference s (utilizado para cachés). El valor predeterminado era mantenerlos durante un segundo por cada megabyte del tamaño máximo de almacenamiento dinámico disponible. Por lo tanto, espere que el montón crezca hasta el tamaño máximo. Si realmente se queda sin memoria con OutOfMemoryException o el rendimiento se vuelve pobre (debido a GC excesivo o cachés pequeños), entonces debe buscar fugas de memoria.

También los servidores Tomcat a menudo sufren pérdidas de memoria después de volver a cargar las aplicaciones. Por ejemplo, Tomcat comparte subprocesos entre todas las aplicaciones, lo que a menudo provoca que la implementación de Sun ThreadLocal retenga valores incorrectamente.

+0

Tomcat no tiene fugas a menos que las aplicaciones dejen hilos o instalen ganchos en la máquina virtual. –

+2

Sucede mucho con ciertos marcos, tontos ClassLoaders ... – wds

+0

Voy a editar un poco mi declaración. La implementación de Sun ThreadLocal, por ejemplo, generalmente genera fugas ya que Tomcat no descarta los hilos. No sé lo que hace la implementación de Harmony de crazybob. –

4

IMO La respuesta de Tom Hawtin es la mejor. Crece hasta que alcanza el máximo, luego ejecuta GC. En un entorno de servidor, esto tiene sentido: desea el mejor rendimiento, no el mejor uso de memoria. Precalcula la cantidad total de memoria, luego le da a cada aplicación un máximo y luego todo encaja y tiene el mejor rendimiento. Este comportamiento puede ser ajustado.

Usa jconsole para ver cuánto se está usando realmente. Haz GC y mira a qué se reduce. Ese número no debería crecer con el tiempo o tiene una pérdida de memoria. Use visualvm para depurar una pérdida de memoria.

Cada vez que recarga una aplicación, utiliza una memoria Perm Gen adicional que no se puede recuperar (en Sun JVM, otros como JRockit no tienen este problema). En producción, no deberías volver a cargar la aplicación. Reinicia Tomcat cada vez.Si realmente desea seguir haciéndolo, puede aumentar la memoria máxima y también aumentar la memoria Max Perm Gen con el indicador -XX: MaxPermSize = 256m

+0

MaxPermSize resultó ser exactamente mi problema. Constantemente implementamos versiones actualizadas de la aplicación durante el desarrollo. –

4

Con el programa Lambda Probe puede ver fácilmente el uso de la memoria en Tomcat . (opción Información del sistema - Uso de la memoria). Se puede ver en una gráfica superviviente del espacio Perm Gen Gen Titular Código Espacio Eden caché

Sólo implementar esta warfile a Tomcat y configurar la opción de inicio -Dcom.sun.management.jmxremote a la puesta en marcha de Java.

Ahora puede ver qué parte de la memoria crece.

Cuestiones relacionadas