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=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <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 — локальная установка не требуется.
Все уроки этого курса
- Выявление узких мест
- Java Flight Recorder
- Анализ с помощью JDK Mission Control
- Распространённые флаги настройки JVM