¿Qué significa una pausa "stop-the-world" en el garbage collection, y cómo la reducen los collectors modernos?
Opciones
- El programa se detiene para siempre y hay que reiniciarlo
- Todos los threads de la app se pausan durante el GC; G1 y ZGC la acortan (Opción correcta)
- El GC detiene el sistema operativo durante un momento
- Solo ocurre cuando se llama a
System.gc()a mano
Respuesta
Todos los threads de la aplicación se pausan mientras trabaja el GC; collectors como G1 y ZGC hacen casi todo el trabajo de forma concurrente o en regiones pequeñas para acortar las pausas
Por qué
Para mover o liberar objetos de forma segura, el GC a veces necesita que todos los threads de la aplicación se pausen. Esa pausa se llama stop-the-world. Las pausas largas congelan un servicio (picos altos de latencia).
G1 (por defecto desde Java 9) divide el heap en regiones y recoge primero las que tienen más basura, buscando un tiempo de pausa objetivo.
ZGC y Shenandoah hacen casi todo el trabajo de forma concurrente, con pausas de cerca de un milisegundo, incluso con heaps muy grandes.
El ajuste empieza midiendo: logs del GC (-Xlog:gc), no adivinando flags.
Recuerda
Pausa = threads congelados por el GC. G1/ZGC buscan pausas cortas.