Estamos ejecutando varias instancias de un proceso de servidor en un cuadro de Linux. La caja tiene 8 núcleos y 16 gb de RAM. Estoy comenzando cada proceso con la opción -Xincgc, usando Java 1.6.Java Garbage Collection detiene todos los procesos de Java
Tenemos varios temporizadores equipados a lo largo de la aplicación que rastrean el tiempo para completar varias tareas. Cuando ocurre una recolección de basura, noto que cada proceso de java en el cuadro muestra que cualquier tarea que estaba ejecutando en ese momento era lenta.
No se estanca durante mucho tiempo, tal vez 100-300ms más o menos, pero la latencia es un factor importante para esto. Tampoco se estanca constantemente, solo periódicamente.
Cuando se produce la recolección de basura, ¿detiene el proceso de java en cualquier momento? Si es así, ¿hay alguna forma de evitar esto? ¿Debo usar diferentes opciones de GC?
ACTUALIZACIÓN:
Para que quede claro, no estoy preocupado por un estancamiento del proceso mientras GC está sucediendo. Puedo ajustar la configuración u optimizar para ese caso. Me pregunto por qué TODOS los procesos Java en ejecución parecen detenerse al mismo tiempo cuando pensé que eran más o menos independientes.
GC en realidad no debería detener todos los procesos. Además, debe leer la [guía de sintonización de GC] (http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html). El recolector de basura predeterminado para Java 6 debe ser el GC paralelo, que está optimizado para el rendimiento, no para el tiempo de pausa. El coleccionista simultáneo podría ser un mejor ajuste. – millimoose
Es posible que desee considerar la agrupación de objetos. Esa sería una forma de reducir la cantidad de GC que está sucediendo. –
@Guaranteed: ¿está ejecutando JVM independientes y cuando una JVM realiza un GC completo, todas las JVM individuales se ven afectadas? ¿Es esto lo que describes? – TacticalCoder