Как отобразить дерево вызовов в VisualVM?

При профилировании процессорного времени приложения с помощью VisualVM можно увидеть вкладку «Дерево вызовов» после создания моментального снимка. Но в моем случае дерево вызовов показывает только некоторые классы и методы RMI TCP, но не показывает ни одного класса моего приложения.

Как я могу отобразить правильное дерево вызовов?

введите здесь описание изображения


person John Threepwood    schedule 01.09.2013    source источник


Ответы (3)


Возможности

  1. Настройки Profiler исключают ваши классы. Измените исключения в настройках Profiler.
  2. Ваше приложение бездействовало во время работы профилировщика. Присоедините профилировщик, затем заставьте программу выполнить код, который вы хотите профилировать.
  3. Возможно, вы профилируете не ту JVM. RMI позволяет довольно легко вызывать другую JVM. Возможно, вам нужно профилировать другую сторону этого соединения RMI.

На вкладке «Профилировщик» есть флажок «Настройки». Если вы установите флажок «Настройки», появится другая панель, которая позволит вам настроить классы, о которых профилировщик собирает данные.

Вот скриншот. скриншот jvisualvm с установленным флажком настроек профилировщика.

person Ryan    schedule 06.09.2013
comment
Спасибо за подсказку по настройкам. Если я нажму на флажок, я увижу профилированные классы, но мне не разрешено их изменять. Текстовые поля не редактируются. Как я могу их редактировать? - person John Threepwood; 08.09.2013
comment
Хорошо, понял. Пришлось остановить профилирование, чтобы отредактировать настройки. После того, как я установил правильные классы, я смог увидеть правильное дерево вызовов для своего приложения. - person John Threepwood; 08.09.2013

Как сказал @Holger, моментальные снимки профилировщика/сэмплера должны отображать только запущенные потоки. Однако я обнаружил на собственном опыте, что моментальные снимки выборки иногда показывают больше потоков, чем профилирование.

Более того, сэмплер VisualVM позволяет вам видеть процессорное время каждого потока в режиме реального времени (без создания моментального снимка), независимо от того, работает ли он, находится в спящем режиме, ожидает или отслеживает.

Я не понимаю, почему это происходит, поскольку профилирование должно быть более точным, чем выборка (см. вот разница), но есть.

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

person Aritz Lopez    schedule 06.09.2013
comment
Спасибо. Да, сэмплирование помогло, и с помощью сэмплирования я могу увидеть дерево вызовов, которое хотел увидеть. - person John Threepwood; 08.09.2013

Дерево вызовов показывает только те потоки, которые действительно выполнялись во время выборки/профилирования (не находились в спящем режиме все время) и чьи трассировки стека не были полностью отфильтрованы. Фильтр настраивается перед началом выборки или профилирования. При включении флажка «настройки» в правом верхнем углу можно настроить фильтр. В случае сэмплера вы также можете настроить частоту дискретизации, которая является компромиссом между производительностью и риском наблюдения за текущим состоянием потока. Но может случиться так, что ваше приложение действительно бездействовало во время профилирования. Тогда единственные потоки, которые вы видите, — это потоки RMI, поддерживающие соединение с VisualVM.

person Holger    schedule 05.09.2013