JMC не показывает горячие методы и пакеты
Я пытаюсь найти проблемные методы в моей серверной программе с JMC. Когда я запускаю сервер локально (в Windows) и запускаю Flight Recorder из JMC - все работает нормально. JMC правильно показывает данные в Code
вкладка: Горячие методы, Дерево вызовов и т. д. Но когда я пытался профилировать сервер на удаленной платформе (в Linux), я получал пустое окно. Для запуска JFR на платформе я использую это:
/opt/java/java8/bin/jcmd 38390 VM.unlock_commercial_features
/opt/java/java8/bin/jcmd 38390 JFR.start duration=10m compress=true filename=dxstress3_cross_try1.jfr settings=/opt/dxstress/settings_for_jmc.jfc
Я использую файл настроек Oracle JDK 8u40 settings_for_jmc.jfc
Я экспортировал из JMC. Содержит настройки execute_sample
<event path="vm/prof/execution_sample">
<setting name="enabled">true</setting>
<setting name="period">10 ms</setting>
</event>
Есть вариант записи или нет таких данных? Что я упустил?
1 ответ
Работает ли, если вы не указали пользовательский файл настроек?
Если это так, проблема, скорее всего, в вашем.jfc-файле. Это должно выглядеть так на JDK 7/8
<event path="vm/prof/execution_sample">
<setting name="enabled" control="method-sampling-enabled">true</setting>
<setting name="period" control="method-sampling-interval">10 ms</setting>
</event>
Если нет, это может быть ошибкой. Возникла проблема с семафорами, не использующими CLOCK_REALTIME в Linux, что могло резко сократить количество выборок. Это было исправлено в 7u80 и 8u25.
Чтобы распечатать текущие настройки событий, выполните:
jcmd <pid> JFR.check verbose=true
Если включен vm / prof / execute_sample, проблема заключается в JVM и сэмплере. В противном случае, это наиболее вероятно в конфигурации.
Сэмплер создает события только в том случае, если метод сэмплирования выполняет код Java, поэтому, если ваше приложение вращается в native, сэмплов не будет.