Информация по семинару
Мастер-класс прошёл 13 февраля 2024
Описание мастер-класса
VisualVM — один из популярных open source профайлеров для JVM. В отличии от Mission Control, который построен вокруг возможностей Java Flight recorder, VisualVM является классическим Java профайлером.
VisualVM включает инструменты профилирования сэмплированием и трассировкой, а также инструментарий для работы с дампами памяти.
Кроме встроенных инструментов, VisualVM поддерживает систему плагинов, которые позволяют существенно расширить базовый функционал.
В рамках мастер-класса у вас будет возможность
Видео
Доклад об экосистеме JVM профайлеров
Перед практичиской частью, рекомендую посмотреть запись следующего доклада, по крайней мере первую половину!
В докладе дан обзор возможностям JVM профайлеров и разъяснены основные техники профилирования.
Видео запись мастер-класса
Подготовка к семинару
Необходимое ПО
Для выполнения практической части семинара вам понадобится компьютер. Материал подготовлен для Windows 10/11, Linux и MacOS.
У вас должно быть установленно следующее ПО.
TCP порты
Следующие порты используются тестовыми приложениями и должны быть заняты другим ПО в ходе мастер-класса:
Погдотовка ПО
Java 17
Вам потребуется OpenJDK 17. Существует несколько дистрибутивов, вы можете использовать любой. Ниже неполный список дистрибьюторов OpenJDK.
- Adoptium (необходим вариант с HotSpot JVM)
- Azul Zulu
- Amazon Corretto
После установки убедитесь, что бинарники 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 выберети следующие плагины и выполните инсталяцию.
Выполните перезапуск 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,
Фильтр исходящих вызовов "Include outgoing calls"
org.apache.catalina.connector.CoyoteAdapterorg.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 и остановие процессы демострационного стенда если они попрежнему выполняются.