Java Flight Recorder
Criação de perfis com baixo custo.
Java Flight Recorder é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
O que é JFR?
Gravador de voo do Java (JFR) é um mecanismo de criação de perfis e coleta de eventos integrado diretamente à JVM.
Ele registra eventos detalhados do tempo de execução — amostras de métodos, alocações, coleta de lixo, bloqueios, IO — em um arquivo binário .jfr, com sobrecarga muito baixa. Ele acompanha o JDK; não é necessário nenhum agente adicional.
Por que a baixa sobrecarga é importante
Perfiladores tradicionais baseados em instrumentação podem deixar um aplicativo duas vezes mais lento ou mais, distorcendo justamente as medições que você deseja obter.
JFR foi projetado para ser executado em produção, normalmente com cerca de 1% de sobrecarga. Isso significa que você pode deixá-lo ativado e capturar uma gravação quando um incidente real acontecer, não apenas em um laboratório.
Iniciando uma gravação na inicialização
Ative o JFR com uma opção da JVM ao iniciar seu aplicativo:
-XX:StartFlightRecording=duration=60s,filename=app.jfr
Isso registra eventos por 60 segundos e depois os grava em app.jfr. Você também pode iniciar uma gravação que continue até a JVM ser encerrada.
Controlando com jcmd
Você também pode iniciar, parar e salvar gravações em uma JVM em execução usando jcmd:
jcmd <pid> JFR.start name=rec settings=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <pid> JFR.stop name=rec
Isso é ideal para obter uma captura de um processo que já está apresentando problemas.
Configurações: padrão versus perfil
JFR acompanha duas configurações integradas:
- padrão — sobrecarga mínima, segura para uso contínuo em produção.
- perfil — amostragem mais detalhada, custo um pouco maior, para investigação direcionada.
Escolha usando settings=profile. Você também pode criar uma configuração personalizada .jfc para ajustar eventos individuais.
O que o JFR registra
JFR captura um conjunto abrangente de eventos, incluindo:
- Amostras de execução (para onde vai o tempo de CPU).
- Alocação de objetos e atividade de TLAB.
- Pausas da coleta de lixo.
- Contenção de bloqueios (
jdk.JavaMonitorWait). - IO de arquivos e soquetes, suspensão de linhas de execução e exceções.
Cada evento tem uma marca de tempo, uma duração e um rastreamento de pilha.
Eventos personalizados
Você pode definir seus próprios eventos JFR para medir o tempo da lógica de negócio. Estenda jdk.jfr.Event, faça uma anotação nele e use begin() / commit() ao redor do trabalho.
Essa é a parte da interface de programação do JFR que funciona bem de forma independente. A gravação real ainda precisa das opções da JVM, mas a classe de evento compila e é executada em qualquer 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);
}
}Gravação contínua
Para serviços de longa duração, execute uma gravação contínua com limite de tamanho ou de idade (um buffer circular).
Os eventos antigos são descartados à medida que novos chegam, portanto o uso do disco permanece limitado. Quando ocorre um incidente, você salva o conteúdo do buffer e obtém instantaneamente os minutos que o antecederam.
Salvando ao sair
Adicione dumponexit=true a uma opção de início da gravação de voo, e o JFR gravará o buffer quando a JVM for encerrada.
Combine isso com -XX:FlightRecorderOptions para definir o tamanho do buffer. Assim, você garante a captura dos dados até mesmo de um processo que está prestes a ser encerrado.
Lendo o arquivo
Um arquivo .jfr é binário. Você pode analisá-lo visualmente no Controle de Missão do JDK (na próxima lição) ou programaticamente com a interface de programação jdk.jfr.consumer e RecordingFile.
A linha de comando jfr print app.jfr também pode exibir eventos como texto para buscas rápidas.
Transmitindo eventos ao vivo
Desde o JDK 14, o JFR oferece transmissão de eventos por meio da interface de programação jdk.jfr.consumer.RecordingStream.
Em vez de salvar um arquivo e abri-lo depois, você se inscreve nos eventos à medida que ocorrem e reage em tempo real — por exemplo, emitindo um alerta quando as pausas da coleta de lixo ultrapassam um limite. Isso transforma o JFR em uma fonte de monitoramento ao vivo, não apenas em uma ferramenta de análise posterior.
Verificação rápida
Qual é o principal motivo pelo qual JFR pode permanecer em execução na produção?
Recapitulação
JFR é o gravador de dados de voo integrado à JVM:
- Coleta de eventos com baixa sobrecarga e segura para produção em arquivos
.jfr. - Inicie por meio de
-XX:StartFlightRecordingoujcmd JFR.start. - Escolha as configurações padrão ou perfil; defina eventos personalizados.
- Use a gravação contínua em buffer circular e
dumponexit. - Analise no Controle de Missão do JDK na próxima lição.
Perguntas Frequentes
A aula “Java Flight Recorder” é grátis?
Sim — o texto completo de “Java Flight Recorder” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Java Flight Recorder”?
Criação de perfis com baixo custo. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Java Flight Recorder”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Identificando gargalos
- Java Flight Recorder
- Analisando com o JDK Mission Control
- Opções comuns de ajuste da JVM