Flags comunes de ajuste de la JVM
Opciones de heap, GC y JIT
Flags comunes de ajuste de la JVM es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
Por qué ajustar la JVM
La JVM tiene valores predeterminados razonables, pero en servicios exigentes a veces es necesario ajustar el tamaño del heap, el recolector de basura y el comportamiento del JIT.
El ajuste es el último paso: perfile primero, corrija el código y recurra a las opciones solo cuando las mediciones lo justifiquen.
Tamaño del heap: -Xms y -Xmx
Las dos opciones más habituales establecen los límites del heap:
-Xms— tamaño inicial del heap.-Xmx— tamaño máximo del heap.
Ejemplo: java -Xms512m -Xmx2g MyApp. Establecer -Xms con el mismo valor que -Xmx evita pausas por redimensionamiento en servidores de larga duración.
Consultar los valores predeterminados
Puede preguntar a la JVM qué valores ha elegido. Runtime expone los valores actuales del heap y -XX:+PrintFlagsFinal muestra el valor efectivo de cada opción.
El ejemplo imprime los límites de memoria de la JVM en ejecución.
public class Main {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
long mb = 1024 * 1024;
System.out.println("Max heap (Xmx): " + (rt.maxMemory() / mb) + " MB");
System.out.println("Total heap now: " + (rt.totalMemory() / mb) + " MB");
System.out.println("Free in heap: " + (rt.freeMemory() / mb) + " MB");
System.out.println("Available cores: " + rt.availableProcessors());
}
}Elegir un recolector
Los JDK modernos ofrecen varios recolectores de basura:
-XX:+UseG1GC— el predeterminado; equilibrado y basado en regiones.-XX:+UseZGC— pausas ultrabajas y heaps grandes.-XX:+UseParallelGC— máximo rendimiento y pausas más largas.-XX:+UseSerialGC— de un solo hilo, para aplicaciones y contenedores pequeños.
Objetivo de pausa de G1
G1 es un recolector orientado al tiempo de pausa. Se le proporciona un objetivo y trata de cumplirlo:
-XX:MaxGCPauseMillis=200pide a G1 que mantenga las pausas cerca de 200 ms.
Es un objetivo flexible, no una garantía. Establecerlo demasiado bajo fuerza colecciones pequeñas y frecuentes, lo que puede perjudicar el rendimiento.
ZGC para baja latencia
Cuando los tiempos de pausa deben mantenerse por debajo de un milisegundo incluso con heaps de varios gigabytes, use ZGC con -XX:+UseZGC.
Realiza la mayor parte de su trabajo de forma concurrente con los hilos de la aplicación. El coste es una sobrecarga adicional de CPU y memoria en comparación con G1. Es ideal para servicios sensibles a la latencia.
Registro del GC
Para ajustar el GC, primero debe observarlo. Active el registro unificado:
-Xlog:gc*:file=gc.log:time,uptime,level,tags
Esto registra cada colección con sus marcas de tiempo y duraciones. Introduzca el registro en un visor (o en JMC/JFR) para detectar pausas largas o frecuentes antes de cambiar cualquier opción.
Contenedores y CPU
Dentro de los contenedores, la JVM lee los límites de cgroup. De forma predeterminada, utiliza una fracción del límite de memoria para el heap.
-XX:MaxRAMPercentage=75.0establece el heap como un porcentaje de la memoria del contenedor.-XX:ActiveProcessorCount=Nreemplaza el número de CPU detectado.
Esto evita comprometer más memoria de la disponible, lo que haría que el orquestador terminara el proceso.
JIT y flags de diagnóstico
Otros flags útiles:
-XX:+HeapDumpOnOutOfMemoryError— vuelca el heap ante un OOM para realizar un análisis posterior.-XX:HeapDumpPath=/tmp— indica dónde escribirlo.-XX:+PrintCompilation— permite ver la actividad de compilación de JIT.
Estos flags tienen un coste bajo y resultan muy útiles cuando algo falla.
Disciplina de ajuste
Reglas de oro para los flags:
- Cambie un solo flag cada vez y vuelva a medir comparando con una línea base.
- No copie flags a ciegas de publicaciones de blogs: pueden estar dirigidos a una JVM antigua.
- La mayoría de las aplicaciones solo necesitan
-Xmxy, quizá, elegir un recolector; los valores predeterminados son adecuados.
Metaspace y subprocesos
El heap no es la única región de memoria:
-XX:MaxMetaspaceSizelimita el espacio de metadatos de las clases; sin este límite, una fuga al cargar clases puede agotar la memoria nativa.-Xssestablece el tamaño de la pila de cada hilo; redúzcalo si ejecuta muchos hilos y auméntelo para la recursión profunda.
Rara vez es necesario ajustar estos valores, pero saber que existen resulta útil cuando el problema está en la memoria nativa y no en el heap.
Comprobación rápida
¿Qué controlan los flags -Xms y -Xmx?
Resumen
Los flags que conviene conocer:
-Xms/-Xmxestablecen los límites del heap.- Elija un recolector: G1 (predeterminado), ZGC (pausas breves), Parallel (rendimiento).
- Establezca
-XX:MaxGCPauseMillispara G1; active-Xlog:gc*para observar su actividad. - Use
MaxRAMPercentageen contenedores yHeapDumpOnOutOfMemoryErrorcomo medida de seguridad. - Cambie un solo flag cada vez y mida los resultados.
Preguntas frecuentes
¿La lección «Flags comunes de ajuste de la JVM» es gratis?
Sí — el texto completo de «Flags comunes de ajuste de la JVM» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Flags comunes de ajuste de la JVM»?
Opciones de heap, GC y JIT Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Flags comunes de ajuste de la JVM»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Identificación de cuellos de botella
- Java Flight Recorder
- Análisis con JDK Mission Control
- Flags comunes de ajuste de la JVM