Java Flight Recorder
Perfilado de baja sobrecarga
Java Flight Recorder es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 2 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.
¿Qué es JFR?
Java Flight Recorder (JFR) es un motor de perfilado y recopilación de eventos integrado directamente en la JVM.
Registra eventos detallados del tiempo de ejecución —muestras de métodos, asignaciones, GC, bloqueos y IO— en un archivo binario .jfr, con una sobrecarga muy baja. Se incluye con el JDK; no necesita ningún agente adicional.
Por qué importa la baja sobrecarga
Los profilers tradicionales basados en instrumentación pueden ralentizar una aplicación al doble o más, distorsionando precisamente las mediciones que desea obtener.
JFR está diseñado para ejecutarse en producción, normalmente con una sobrecarga de alrededor del 1 %. Esto significa que puede dejarlo activado y capturar una grabación cuando ocurra un incidente real, no solo en un entorno de laboratorio.
Iniciar una grabación al arrancar
Active JFR con una opción de la JVM al iniciar la aplicación:
-XX:StartFlightRecording=duration=60s,filename=app.jfr
Esto registra eventos durante 60 segundos y después los escribe en app.jfr. También puede iniciar una grabación que se ejecute hasta que termine la JVM.
Control mediante jcmd
También puede iniciar, detener y volcar grabaciones en una JVM en ejecución mediante jcmd:
jcmd <pid> JFR.start name=rec settings=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <pid> JFR.stop name=rec
Es ideal para obtener una instantánea de un proceso que ya está comportándose mal.
Configuración: default frente a profile
JFR incluye dos configuraciones integradas:
- default — sobrecarga mínima, segura para uso continuo en producción.
- profile — muestreo más detallado y un coste ligeramente mayor, para investigaciones específicas.
Elija mediante settings=profile. También puede escribir una configuración .jfc personalizada para ajustar eventos individuales.
Qué registra JFR
JFR captura un conjunto variado de eventos, entre ellos:
- Muestras de ejecución (en qué se emplea el tiempo de CPU).
- Asignaciones de objetos y actividad de TLAB.
- Pausas del recolector de basura.
- Contención de bloqueos (
jdk.JavaMonitorWait). - IO de archivos y sockets, aparcamiento de hilos y excepciones.
Cada evento tiene una marca de tiempo, una duración y un stack trace.
Eventos personalizados
Puede definir sus propios eventos de JFR para medir el tiempo de la lógica de negocio. Extienda jdk.jfr.Event, anótelo y, después, use begin() / commit() alrededor del trabajo.
Esta es la parte de la API de JFR adecuada para uso independiente. Una grabación real sigue necesitando las opciones de la JVM, pero la clase de evento compila y se ejecuta en cualquier JDK.
import jdk.jfr.Event;
import jdk.jfr.Label;
public class Main {
@Label("Order Processing")
static class OrderEvent extends Event {
@Label("Order Id") int orderId;
}
public static void main(String[] args) {
OrderEvent e = new OrderEvent();
e.orderId = 42;
e.begin();
// ... do the work being measured ...
e.commit();
System.out.println("Custom JFR event committed for order " + e.orderId);
}
}Grabación continua
Para servicios de larga duración, ejecute una grabación continua con un tamaño o una antigüedad máximos (un búfer circular).
Los eventos antiguos se descartan a medida que llegan otros nuevos, por lo que el uso del disco permanece limitado. Cuando ocurre un incidente, vuelque el búfer y tendrá al instante los minutos que lo precedieron.
Volcado al salir
Añada dumponexit=true a una opción de start-flight-recording y JFR escribirá el búfer cuando la JVM se apague.
Combínelo con -XX:FlightRecorderOptions para configurar el tamaño del búfer. Esto garantiza que capture datos incluso de un proceso que está a punto de terminar.
Lectura del archivo
Un archivo .jfr es binario. Puede analizarlo visualmente en JDK Mission Control (en la siguiente lección) o mediante programación con la API jdk.jfr.consumer y RecordingFile.
La línea de comandos jfr print app.jfr también puede volcar los eventos como texto para buscarlos rápidamente con grep.
Transmitir eventos en directo
Desde JDK 14, JFR admite la transmisión de eventos mediante la API jdk.jfr.consumer.RecordingStream.
En lugar de volcar un archivo y abrirlo más tarde, se suscribe a los eventos a medida que ocurren y reacciona en tiempo real —por ejemplo, enviando una alerta cuando las pausas del GC superan un umbral—. Esto convierte JFR en una fuente de monitorización en directo, no solo en una herramienta para análisis posteriores.
Comprobación rápida
¿Cuál es la razón principal por la que JFR puede dejarse ejecutándose en producción?
Resumen
JFR es el grabador de datos de vuelo integrado en la JVM:
- Recopilación de eventos con poca sobrecarga y segura para producción en archivos
.jfr. - Inicio mediante
-XX:StartFlightRecordingojcmd JFR.start. - Elección de la configuración default o profile; definición de eventos personalizados.
- Uso de grabaciones continuas con búfer circular y
dumponexit. - Análisis posterior en JDK Mission Control.
Preguntas frecuentes
¿La lección «Java Flight Recorder» es gratis?
Sí — el texto completo de «Java Flight Recorder» 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 «Java Flight Recorder»?
Perfilado de baja sobrecarga 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 2 de 4.
¿Cuánto tiempo toma la lección «Java Flight Recorder»?
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