0Pricing
Java Academy · Урок

Java Flight Recorder

Профилирование с низкими накладными расходами

«Java Flight Recorder» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Что такое JFR?

Java Flight Recorder (JFR) — это движок профилирования и сбора событий, встроенный непосредственно в JVM.

Он записывает подробные события времени выполнения — выборки методов, выделения памяти, сборку мусора, блокировки, IO — в двоичный файл .jfr с очень низкими накладными расходами. Он входит в состав JDK; дополнительный агент не требуется.

Почему важны низкие накладные расходы

Традиционные профилировщики с инструментированием могут замедлить приложение в 2 раза и более, искажая именно те измерения времени, которые Вам нужны.

JFR разработан для работы в рабочей среде, обычно с накладными расходами около 1%. Это означает, что его можно оставить включённым и получить запись при реальном инциденте, а не только в лаборатории.

Запуск записи при старте

Включите JFR с помощью флага JVM при запуске приложения:

  • -XX:StartFlightRecording=duration=60s,filename=app.jfr

Эта команда записывает события в течение 60 секунд, а затем сохраняет их в app.jfr. Также можно запустить запись, которая будет работать до завершения JVM.

Управление с помощью jcmd

Вы также можете запускать и останавливать записи, а также сохранять их дамп в работающей JVM с помощью jcmd:

  • jcmd <pid> JFR.start name=rec settings=profile
  • jcmd <pid> JFR.dump name=rec filename=out.jfr
  • jcmd <pid> JFR.stop name=rec

Это особенно удобно для получения снимка процесса, который уже работает неправильно.

Настройки: стандартная и профильная

В JFR входят две встроенные конфигурации:

  • стандартная конфигурация — минимальные накладные расходы, безопасна для непрерывного использования в рабочей среде.
  • профильная конфигурация — более подробная выборка, немного выше затраты, для целенаправленного исследования.

Выберите профильную конфигурацию с помощью settings=profile. Также можно написать пользовательскую конфигурацию .jfc для настройки отдельных событий.

Что записывает JFR

JFR записывает богатый набор событий, включая:

  • Выборки выполнения (куда уходит время CPU).
  • Выделение объектов и активность TLAB.
  • Паузы сборки мусора.
  • Конкуренцию за блокировки (jdk.JavaMonitorWait).
  • Операции IO с файлами и сокетами, приостановки потоков и исключения.

У каждого события есть временная метка, длительность и трассировка стека.

Пользовательские события

Вы можете определять собственные события JFR для измерения времени выполнения бизнес-логики. Унаследуйте jdk.jfr.Event, добавьте к нему аннотацию, а затем используйте begin() / commit() вокруг нужной операции.

Это часть API JFR, удобная для автономного использования. Для настоящей записи по-прежнему требуются флаги JVM, но класс события компилируется и работает в любом 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);
    }
}

Непрерывная запись

Для долгоживущих служб используйте непрерывную запись с ограниченным размером или сроком хранения (так называемый кольцевой буфер).

Старые события удаляются по мере поступления новых, поэтому использование диска остаётся ограниченным. Когда происходит инцидент, сохраните содержимое буфера и сразу получите минуты, предшествовавшие ему.

Сохранение при завершении

Добавьте dumponexit=true к флагу запуска записи, и JFR сохранит буфер при завершении JVM.

Используйте этот параметр вместе с -XX:FlightRecorderOptions для настройки размера буфера. Это гарантирует получение данных даже от процесса, который вот-вот завершится.

Чтение файла

Файл .jfr является двоичным. Анализируйте его визуально в JDK Mission Control (на следующем уроке) или программно с помощью интерфейса jdk.jfr.consumer и RecordingFile.

Команда jfr print app.jfr также может вывести события в виде текста для быстрого поиска.

Потоковая передача событий в реальном времени

Начиная с JDK 14, JFR поддерживает потоковую передачу событий через интерфейс jdk.jfr.consumer.RecordingStream.

Вместо того чтобы сохранять файл и открывать его позже, Вы подписываетесь на события по мере их возникновения и реагируете в реальном времени — например, отправляете оповещение, когда паузы сборки мусора превышают порог. Так JFR превращается в источник мониторинга в реальном времени, а не просто в инструмент посмертного анализа.

Быстрая проверка

Почему JFR можно оставлять работающим в рабочей среде?

Итоги

JFR — встроенный в JVM регистратор данных о работе:

  • Сбор событий с низкими накладными расходами, безопасный для рабочей среды, в файлы .jfr.
  • Запуск через -XX:StartFlightRecording или jcmd JFR.start.
  • Выбор стандартных или профильных настроек; определение пользовательских событий.
  • Использование непрерывной записи в кольцевой буфер и параметра dumponexit.
  • Далее анализ в JDK Mission Control.

Часто задаваемые вопросы

Урок «Java Flight Recorder» бесплатный?

Да — полный текст урока «Java Flight Recorder» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Java Flight Recorder»?

Профилирование с низкими накладными расходами Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Java Flight Recorder»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Выявление узких мест
  2. Java Flight Recorder
  3. Анализ с помощью JDK Mission Control
  4. Распространённые флаги настройки JVM
← Назад к Java Academy