G1GC y ZGC son recolectores de basura incluidos en Java, pero priorizan objetivos distintos. G1 es el recolector predeterminado en la mayoría de configuraciones y busca equilibrar rendimiento total y pausas; ZGC está diseñado para baja latencia y hace gran parte del trabajo concurrentemente. Eso no convierte a ZGC en una solución automática para cualquier tirón: el rendimiento final depende del equipo, la memoria, la carga del mundo y otros cuellos de botella.
Qué significa “pausa” y qué no significa
Una pausa del recolector es una detención breve de los hilos de la aplicación durante una fase de recolección. La documentación de Oracle describe pausas máximas de ZGC inferiores a un milisegundo como objetivo/característica del recolector, pero no promete que Minecraft nunca tenga tirones: la carga de chunks, compilación, drivers, mods, CPU y almacenamiento también afectan la fluidez. G1 tampoco tiene una duración fija garantizada; su objetivo de pausa no es un límite estricto.
La guía de Oracle recomienda comenzar con el recolector que selecciona la JVM y ajustar primero el tamaño del heap si hace falta. Cambiar de recolector tiene sentido cuando observas pausas atribuibles al GC en los registros y una prueba controlada muestra una mejora que compensa cualquier cambio en rendimiento general.
Disponibilidad por versión de Java
- Java 17: G1 está disponible; ZGC no ofrece el modo generacional descrito aquí.
- Java 21 y 22: Generational ZGC se activa con
-XX:+UseZGC -XX:+ZGenerational. - Java 23 y posteriores: Generational ZGC pasa a ser el modo por defecto al seleccionar ZGC; normalmente basta con
-XX:+UseZGC. La opción explícita-XX:+ZGenerationalqueda obsoleta en Java 23 según OpenJDK, así que evita copiar flags antiguos sin comprobar la versión.
-XX:+UseNUMA, -XX:+AlwaysPreTouch ni un tamaño fijo de heap como receta universal.Cómo hacer una comparación útil
- Anota la versión de Minecraft, Java, cargador, mods, resolución, distancia de renderizado, memoria asignada y estado del equipo.
- Haz una copia del mundo y usa la misma zona y recorrido para ambas pruebas. Mantén iguales los ajustes; cambia solo el recolector.
- Repite el mismo recorrido varias veces y deja que el juego se caliente antes de registrar. Una sola partida no separa variación normal de una mejora real.
- Para ver actividad de GC, añade temporalmente
-Xlog:gca una instancia de prueba. Retira después el argumento si no necesitas el registro; este muestra eventos de GC, no FPS ni toda la causa de los tirones. - Compara fluidez observada y registros bajo la misma carga. Si los tirones coinciden con eventos de GC y ZGC los reduce sin causar otros problemas, conserva el cambio. Si no hay esa relación, busca la causa en mods, renderizado o carga de chunks.
Lectura recomendada
- Documentación de Oracle: recolectores disponibles y criterios para elegir.
- Documentación de Oracle: G1 y sus objetivos de pausa.
- OpenJDK JEP 439: ZGC generacional (Java 21).
- OpenJDK JEP 474: modo generacional predeterminado (Java 23).
Esta página explica diferencias documentadas; no publica un benchmark propio. Para recomendar una configuración concreta, hace falta medirla en una carga comparable.