Информация по семинару

Мастер-класс прошёл 13 февраля 2024

Описание мастер-класса

VisualVM — один из популярных open source профайлеров для JVM. В отличии от Mission Control, который построен вокруг возможностей Java Flight recorder, VisualVM является классическим Java профайлером.

VisualVM включает инструменты профилирования сэмплированием и трассировкой, а также инструментарий для работы с дампами памяти.

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

В рамках мастер-класса у вас будет возможность

  • на практике попробовать по-профилировать демонстрационное приложение используя VisualVM,
  • познакомиться с функционалом инспектора дампов памяти,
  • изучить возможности VisualVM по работе с дампами Java Flight Recorder,
  • а также узнать о наиболее интересных плагинах VisualVM.
  • Видео

    Доклад об экосистеме JVM профайлеров

    Перед практичиской частью, рекомендую посмотреть запись следующего доклада, по крайней мере первую половину!

    В докладе дан обзор возможностям JVM профайлеров и разъяснены основные техники профилирования.

    Видео запись мастер-класса

    Подготовка к семинару

    Необходимое ПО

    Для выполнения практической части семинара вам понадобится компьютер. Материал подготовлен для Windows 10/11, Linux и MacOS.

    У вас должно быть установленно следующее ПО.

  • Java 17 JDK - можно более старшую версию, но материал проверен на Adoptium Java 17
  • VisualVM 2.1.7
  • Apache Maven 3.8 или старше
  • git - клиент командной строки
  • TCP порты

    Следующие порты используются тестовыми приложениями и должны быть заняты другим ПО в ходе мастер-класса:

  • 5555
  • 8080
  • 9005
  • 9006
  • 8983
  • Погдотовка ПО

    Java 17

    Вам потребуется OpenJDK 17. Существует несколько дистрибутивов, вы можете использовать любой. Ниже неполный список дистрибьюторов OpenJDK.

    После установки убедитесь, что бинарники JDK доступны в $PATH. Команда java -version должна выкодить корректную версию.

    VisualVM

    Установите VisualVM 2.1.7., воспользовавшись дистрибутивом с https://visualvm.github.io.
    Проверьте, что VisualVM запускается корректно.

    git

    Для работы с материалом семинара вам понадобится git клиент с поддержкой командной строки.

    Maven

    Для запуска демонстрационных проектов необходим Maven версии 3.8 или выше.

    После инсталяции убедитесь, что команда mvn --version корректно работает из консоли и возвращает правильные номера версий Java и Maven.

    Загрузка материалов

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

    В директории LABDIR выполните команду: git clone -b demo20240213 https://github.com/aragozin/BroadLeafCommerce-DemoSite.git blf-demo

    Запуск тетового примера

    В директории LABDIR/blf-demo выполните команду mvn -P run_n_load test Первый запуск потребует несколько минут, по итогу maven сборка должна завершиться успешно.

    После завершения сборки зайдите на URL http://127.0.0.1:8080/ . Вы должны увидеть фронтэнд магазина “HEAT CLINIC”.
    Страница может открываться крайне медленно, это ожидаемо.

    CPU системы должен быть загружен java процессами, так как предыдущая команда включает генератор нагрузки.

    В директории LABDIR/blf-demo выполните команду mvn clean

    Если директория LABDIR/blf-demo/pids не была удалена предыдущей командой. Удалите её врeчную (например rm -rf LABDIR/blf-demo/pids).

    Запущенные на предыдущем шаге java процессы должны завершиться.

    Практическа часть

    Подготовка среды

    Установка плагинов VisualVM

    Запустите VisualVM. Диалог установки плагинов доступен через меню Tools > Plugins.

    На вкладке Available Plugins выберети следующие плагины и выполните инсталяцию.

  • Thread Inspector
  • VisualVM-MBeans
  • Выполните перезапуск VisualVM после установки плагинов.

    Запуск демострационного приложения

    Обновим демострационные материалы.

    1 в директории LABDIR/blf-demo выполним команду git pull

    Запустим демонстрационный стенд.

    2 в директории LABDIR/blf-demo выполним команду mvn -P run_n_load test Команда требует значительного времени для запуска окружения. Сборка должна завершиться успешно.

    Проверим доступность приложения по ссылке http://127.0.0.1:8080.
    Страница может грузиться очень медленно, это ожидаемо.

    3 Перейдём в VisualVM. Список java процессов в VisualVM должен выглядеть следующем образом.

    Обзор возможностей VisualVM

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

    4 Для подключения к процессу удалённо через протокол JMX, нужно выбрать пункт меню
    File > Add JMX connection ...

    И ввести параметры подключения, в нашем случае 127.0.0.1:5555.
    Также надо ключить галочку Do not require SSL connection.

    5 После конфигурации JMX соединения, оно появиться в списке процессов. Соединение с процессом можно осуществить двойным щелчком.

    Информация о процессе Overview

    Метрики Monitor

    Потоки Threads

    Браузер MBean`ов MBeans

    Сэмплирование потоков

    Запуск сэмплирования потоков

    6 Для начала сессии сэмплирования перейдите во вкладку Sampler
    и нажмуте кнопку .

    В процессе сэмплирования вам будут доступны две вкладки.

    Завершите сэмплирование кнопкой и создайте снапшот данных кнопкой на вкладке CPU Samples.

    Работа со снапшотом сэмплера

    7 Перейдём во вкладку с открытым снапшотом.

    Перезапуск сэмплирования с настройкой фильтров

    8 На вкладке Sampler включите галочку Settings и очистите список "Do not profile classes".

    Затем запустите сессию кнопкой . Подждите 30 секунд, остановите сессию и сохраните .

    9 Откроем снапшот. Исключим из него потоки RMI, которые нам не интересны с помощью фильтра.

    10 Затем, перейдём в режим "Hot spots".

    11 Через контекстное меню можно найти фрейм sun.nio.ch.SocketDispatcher.read0 в дереве обратных вызовов.

    Работа с JFR (Java Flight Recorder)

    Создание JFR дампа

    Для управления JFR мы будем использовать интерфейс диагностических комманд через MBean.

    12 Перейдём на вкладку MBeans и найдём бин com.sun.management > DiagnosticCommand.

    Далее выполним на этом бине операцию jfrConfigure с параметром stackdepth=1024.

    13 Затем выполним операцию jfrStart с параметрами settings=profile filename=dump1.jfr duration=60s.

    Через минуту файл LABDIR/blf-demo/var/storefront/dump1.jfr можно будет открыть в VisualVM.

    14 Для этого можно использовать File > Load...

    Трассировка JDBC

    15 Для начала сессии трасировки нужно перейти во вкладку Profiler и нажать кнопку

    16 После начала трасстировки вы увидете таблицу с SQL стейтментами выполняемыми через JDBC. Так же в этой таблице есть возможность увидеть входящие стэк-трейсы.

    17 Сделайте затем остановите сессию . Снапшот нельзя сохранить после останова сессии профилирования.

    Трассировка вызовов методов

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

    18 Установим конфигурацию трассировки.

    Фильтр классов для трассировки "Profile classes" org.apache.tomcat.jdbc.pool.JdbcInterceptor,
    org.apache.catalina.connector.CoyoteAdapter
    Фильтр исходящих вызовов "Include outgoing calls" org.apache.tomcat.jdbc.pool.JdbcInterceptor,
    org.apache.catalina.connector.CoyoteAdapter

    19 Затем запустим сессию профилирования кнопкой

    20 Сделайте затем остановите сессию . Снапшот нельзя сохранить после останова сессии профилирования.

    Работа с дампами памяти

    Перезапуск демострационного окружения без нагрузки

    21 В директории LABDIR/blf-demo
    остановим приложение удалив директорию pids (например rm -rf pids).

    Затем запустим приложение без нагрузки: mvn -P run test Команда требует значительного времени для запуска окружения. Сборка должна завершиться успешно.

    Проверим доступность приложения по ссылке http://127.0.0.1:8080.

    Получение дампа памяти в VisualVM

    22 Подключившись к процессу com.community.SiteApplication перейдём на вкладку Monitor и воспользуемся кнопкой .

    23 Дамп памяти будет автоматически открыт в браузере дампов.

    Сравнение дампов памяти

    24 Запустим приложение нагрузку на демонстрационное приложение: mvn -P run_n_load test Сборка должна завершиться успешно.

    25 Повторим опрерацию сохранения дампа памяти приложения.

    26 Далее на втором дампе в режиме "Objects" нажмём кнопку "Compare with another heap dump ..." и выберем первый дамп из списка.

    27 В результате будет построена разница гистограммы классов между дампами.

    Завершим работу тестового стенда.

    28 Удалите директорию LABDIR/blf-demo/pids (например rm -rf pids).
    Проверьте выполняющиеся java процессы с помощью jcmd и остановие процессы демострационного стенда если они попрежнему выполняются.

    Дополнительные материалы

  • Флейм граф тестового приложения