Мониторинг блокировок с помощью Java Flight Recorder и Java Mission Control - PullRequest
0 голосов
/ 26 ноября 2018

Что я хочу сделать

У меня есть программа на Java, которую я пытаюсь улучшить.Я подозреваю, что синхронизированные блоки в коде снижают производительность, но я хотел бы убедиться, что это моя проблема, прежде чем касаться моего кода.

Как я об этом говорил

Чтобы проверить, действительно ли проблема с синхронизированными блоками, я записал выполнение моей программы на тестовом сервере с помощью Flight Recorder, скачал созданный файл jfrна моем рабочем столе и открыл его с помощью Java Mission Control.Однако страница Lock Instances в Java Application ничего не показывает.Единственная подсказка, которую я получаю, - это сообщение в представлении «Результаты», которое гласит:

Правило блокировки Java требует, чтобы события были доступны для следующих типов событий: com.oracle.jdk.JavaMonitorEnter

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

Мой вопрос

Как включить запись событий типа com.oracle.jdk.JavaMonitorEnter с помощью Java Flight Recorder?
Или я что-то упускаю, и есть лучший способвыяснить, сколько блокировок синхронизированных блоков выполняется в программе на Java?

Моя среда

Я использую Oracle JDK версии 1.8.0_191.Версия Java Mission Control, которую я использую на своем рабочем столе, - 6.0.0.Наконец, команда, которую я использую для записи выполнения моей программы, выглядит следующим образом:

java -XX:+UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:+FlightRecorder -XX:StartFlightRecording=settings=profile,dumponexit=true,filename=test.jfr -classpath lib/*:src/ <my program with its arguments>

Я должен также добавить, что подключение к серверу напрямую с помощью Java Mission Control не является опцией (или это так?), Поскольку яя использую отскок SSH для фактического подключения к нему ...

1 Ответ

0 голосов
/ 26 ноября 2018

Несколько дополнительных исследований дали мне ответ.

События JavaMonitorEnter (и другие события, которые нужно отслеживать) должны быть указаны в файле конфигурации бортового регистратора.В этой ситуации я использовал конфигурацию profile, которая предоставляется вместе с конфигурацией default вместе с Oracle JDK.

Я создал свою собственную конфигурацию, используя Java Mission Control. Этот блог был очень полезен при представлении того, как найти инструмент для создания пользовательских конфигураций записи в Java Mission Control.

Затем я экспортировал свою вновь созданную конфигурацию, загрузил ее в свою тестовую среду и указалэта конфигурация в моей команде (ниже только измененной опции):

-XX:StartFlightRecording=settings=/home/<username>/Custom,<other options>...

В чем моя проблема на самом деле была

Блокировка записей активируется в конфигурациях регистратора полета, предоставляемыхОракул JDK.Однако для фактической записи блокировок они должны длиться более определенного порога (20 мс в конфигурации default, 10 мс в конфигурации profile).

В моем приложении отдельные блокировки были короче этого порога, поэтому при открытии записи в Java Mission Control ничего не появлялось.

Моим основным источником путаницы было сообщение о том, что «Правило блокировки Java требует, чтобы события были доступны ...».Более точное описание моей ситуации состояло бы в том, что никаких блокировок, превышающих порог конфигурации, не было зарегистрировано .

...