Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись

Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись Java, Telegram (ссылка), IT, Программист, Длиннопост

Анализ работы JVM (Java Virtual Machine)

Среди множества способов и решений для анализа виртуальной машины Java есть одно хорошее решение — Flight Recorder. Благодаря этой утилите работающая Java-машина может записывать все происходящее внутри.

Достоинства Flight Recorder

Если сравнивать Flight Recorder с другими похожими решениями то можно отметить

  • Минимальную нагрузку на само приложение (пишут, что она составляет около 1% производительности).

  • Наличие большого количества метрик и возможность интегрировать свои кастомные метрики.

  • Простоту интеграции и поддержки.

  • Отсутствие необходимости перезагрузки приложения. Утилита работает с "горячей виртуальной машиной"

  • Возможность запускать аналитику на фиксированное количество секунд/минут.

Запуск Flight Recorder.

Предположим, вы уже создали свое приложение и готовы запустить его с помощью JAR. Если вы хотите при старте приложения запустить процесс записи Flight Recorder, то достаточно выполнить следующую команду

java -XX:+FlightRecorder -XX:StartFlightRecording=durati -jar myjar.jar

В данном случае, в течение 10 секунд после старта Flight Recorder будет записывать все происходящее в виртуальной машине.

Используем JCMD для динамического подключения записи.

Как альтернативу можно использовать утилиту входящую в jdk - JCMD которая позволит подключиться уже к рабочей JVM.

Чтобы узнать, какие виртуальные машины работают в данный момент, достаточно просто написать JCMD и получить что-то вроде:

Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись Java, Telegram (ссылка), IT, Программист, Длиннопост

Слева находятся номера процессов которые можно использовать для подключения.

Как только мы определили, к какому процессу (42800) нужно подключиться, вводим команду для записи отчета на 30 секунд. Файл с записанной аналитикой будет назван myreport.fjr. Итоговая команда будет следующей:

JCMD 42800 JFR.start durati filename=myreport.jfr

Анализируем отчет

Самый просто способ прочитать myreport.jfr - установить программу JMC (Java Mission Control). Скачать её можно вот тут.

После запуска программы можно выбрать существущий myreport.jfr либо подключиться к рабочей виртуальной машине и создать его внутри программы.

Анализируем File I/O - работу с файловой системой.

На вкладке "OUTLINE" необходимо выбрать "File I/O", и тогда можно получить аналитику работы программы с файловой системой. Я намеренно написал код, который создавал файлы размером 20 МБ. Вот что получилось в итоге:

Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись Java, Telegram (ссылка), IT, Программист, Длиннопост

Выглядит довольно точно. Где то 6 файлов было записано каждый по 20 мб.

Socket IO - работа с сетью.

Чтобы просмотреть работу и трафик, необходимо выбрать "Socket I/O". В моем случае, взаимодействия с сетью было крайне мало. Вот результат:

Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись Java, Telegram (ссылка), IT, Программист, Длиннопост

Картина совпала - по сети передавались лишь байты данных. Это примерно ничего.

Аналитика памяти - Ключевая вещь для анализа работы виртуальной машины.

Чтобы оценить затраты памяти, необходимо выбрать "Memory" внутри вкладки "Outline":

Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись Java, Telegram (ссылка), IT, Программист, Длиннопост

Как можно заметить, в памяти было выделено до 80мб, но затем собрано сборщиком мусора. Судя по всему, утечек нет. Но для хорошей аналитики утечек минуты работы профайлера недостаточно.

Аналитика Сборщикам Мусора.

Тут несколько вариантов. Есть Grabage Collectons, GC Configuration, GC Summary. Давайте рассмотрим первый и последний:

Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись Java, Telegram (ссылка), IT, Программист, Длиннопост

Итак, на вкладке видна детализированная аналитика времени работы сборщика мусора. Также можно просмотреть общую статистику:

Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись Java, Telegram (ссылка), IT, Программист, Длиннопост

Суммарное время сборщика сборщика мусора составило 56 мс, и при этом было сделано 13 остановок.

Аналитика потоков. Thread Dumps

Также важной частью отчета является информация о состоянии потоков. Благодаря этим данным можно выявить взаимные блокировки и подобные проблемы. Вкладка "Thread Dumps":

Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись Java, Telegram (ссылка), IT, Программист, Длиннопост

Анализ событий.

Flight Recorder также позволяет записывать происходящие события внутри JVM (и даже создавать свои!). Затем все эти процессы можно удобно просмотреть в Event Browser:

Записываем состояние виртуальной машины Java с помощью Flight Recorder. Анализируем запись Java, Telegram (ссылка), IT, Программист, Длиннопост

В качестве заключения.

Flight Recorder очень удобная в использовании утилита для аналитики виртуальной машины, которая делает внутренние процессы даже сложных Java программ значительно более читаемыми. Меня лично радует сам факт разивития подобных утилит. Кому интересна Java а также мир разработки приглашаю в мой телеграм канал.

Спасибо за внимание, надеюсь вы узнали что то новое.