Esto es un problema difícil de encontrar.Ya que tenía pasar algún tiempo en un sistema de averiguar esto y demostrar, Permítanme enumerar el escenario en el que esto ocurrió
- Nos quedamos atrapados con el uso de Java 6, que no tiene ningún colector de basura compactación
- Nuestro solicitud fue haciendo demasiado GC en su mayoría colección generación joven y algunos collecition grande y vieja generación
- nuestra montón de tamaño era bastante grande- problema principal (hemos reducido, pero nuestra solicitud fue alto consumo de demasiadas cuerdas y colecciones)
El problema que se manifestó w como que solo un algoritmo particular en nuestro sistema estaba funcionando lento; el resto, que funcionaba al mismo tiempo, funcionaba normalmente. Esto descarta el GC completo; También utilizamos jstat y otras herramientas j ** para verificar GC, volcados de hilo + seguimiento de los registros del GC.
Desde los volcados de subprocesos de jstack, tomados durante un tiempo, pudimos obtener una idea de qué bloque de código realmente se estaba desacelerando. Entonces la duda recayó en la fragmentación del montón.
Para probar que escribí un programa simple que inicializó dos List one ArrayList y una LinkedList y agregué operaciones que causan el cambio de tamaño. Esta prueba podría ejecutarse a través del controlador REST. Normalmente no hay mucha diferencia. Pero dentro de un montón fragmentado hay una clara diferencia en el tiempo; un gran tamaño de colección con ArrayList llega a ser muy lento que con la lista Vinculada. Estos tiempos se registraron, y no hubo otra explicación a esto que una cabeza fragmentada.
Con Java 7, pasamos a G1GC, junto con mucho trabajo en sintonización de GC y mejoras en las aplicaciones; Aquí la compactación de montones es mucho mejor y puede manejar montones más grandes, aunque supongo que cualquier pila de más de 16 g te llevará a lugares en los que realmente no quieres ir: GC suckage :)
¿Estás seguro de que es GC? Especialmente, ¿el proceso vm muestra una alta utilización de CPU durante las pausas? Si no, asumiría que tienes una condición de carrera en alguna parte. – Esko
No es una condición de carrera, estoy seguro. Checked in profiler, y casi no usamos bloqueos, y el comportamiento es el mismo en diferentes servidores, solo diferentes tiempos de retardo. Y no una alta utilización de la CPU: todos los hilos en la aplicación se detienen. – Vitaly
[Editado] Después de activar los registros del GC, descubrí un problema de "promoción fallida". Una buena descripción está aquí: http://www.sun.com/bigadmin/content/submitted/cms_gc_logs.html. Gracias a everybode por ayuda. – Vitaly