2012-06-24 19 views
13

Tenemos una aplicación web que se ejecuta Java 6, Tomcat 6, Primavera marco 3, 4 Hibernate, Ehcache. Tenemos un problema con los tiempos de recolección de basura extremadamente largos que pueden tomar 30 segundos o más, dejando la aplicación sin responder.extremadamente largos tiempos de recolección de basura

que estamos actualmente en pruebas, pero aparte de lo obvio: añadir más memoria, me preguntaba si hay aspectos que podríamos sintonizar a reducir el tiempo de recolección de basura.

el principal contribuyente al uso de la memoria es EHCache ya que estamos almacenamiento en caché de forma agresiva. Pero siempre me resulta difícil dimensionar las tiendas EHCache (las nuevas tiendas de tamaño de bytes EhCache, provocan todo tipo de problemas con nosotros porque los gráficos de objetos en caché pueden ser bastante grandes).

Estos son mis ajustes para la JVM

JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC 
+0

se obtienen estos largos tiempos de memoria antes de llegar al máximo de 704MB? La JVM puede ser un poco "agresiva" al tratar de reducir la memoria utilizada (y posiblemente reubicarla) antes de decidir aumentar la memoria utilizada. ¿Se comporta de la misma manera si usas -Xms704m -Xmx704m en marcha? –

+0

Usando "jstat -gc 1s pid" puede ver si el uso de memoria llega a los viveros o si la asignación de memoria entre guarderías, eden y anterior debe cambiarse. –

+1

A falta de perfilar su aplicación con JProdilfer/Yourkit, no tendrá ninguna sugerencia sólida. –

Respuesta

3

Para reducir los tiempos de GC, lo mejor que puede hacer es utilizar fuera de la pila de memoria. Si puede mover la mayor cantidad de datos grandes que pueda, puede reducir el tiempo total de su GC a tan solo 10 milisegundos, incluso con 100 s de MB de memoria del montón. Creo que Ehcache es compatible con las tiendas de datos de montón, pero si no funciona o no puedes usarlo, te sugiero que busques alternativas que sí lo hagan.

Teniendo en cuenta que sólo tiene un tamaño de memoria 700 MB como máximo, parece que se está ejecutando en un servidor con memoria muy limitada. De lo contrario, le sugiero que comience con un máximo de 8 o 16 GB y reduzca el tamaño de la memoria si cree que realmente no la necesita.

+0

El tamaño de la memoria no debería ser un problema en los tiempos del GC. Solo comienza la cantidad de objetos que se crean antes de GC. – user2763361

+1

@ user2763361 La cantidad de objetos es muy importante y otros factores como el número de referencias y la generación de esas referencias, pero es el tamaño que se puede ver en las herramientas de supervisión.Si reduce la memoria consumida, puede mejorar el rendimiento porque esto generalmente significa reducir la cantidad de objetos y la cantidad de indirección de referencia. En resumen, tienes razón, pero el uso de la memoria es más fácil de medir. –

+0

Bien dicho. Relacionado: http://stackoverflow.com/questions/21675709/how-to-find-which-objects-are-creating-the-most-garbage – user2763361

1

No es una excelente herramienta de gente Cuadrangular. Verifique este enlace y el ejemplo rápido que tienen. Foursquare Heap tool.. Según los diagnósticos que encuentre en cualquiera de las herramientas mencionadas anteriormente, la solución más ordenada para resolver el problema será agregar más RAM o agregar potencia al procesador de su CPU. Si está abierto a algunos cambios de infraestructura, marque Zing from Azul Systems. Pero creo que la segunda opción podría ser exagerada.