Как отобразить дерево вызовов в VisualVM?
При профилировании процессорного времени приложения с помощью VisualVM можно увидеть вкладку "Дерево вызовов" после моментального снимка. Но в моем случае дерево вызовов показывает только некоторые классы и методы RMI TCP, но не один класс моего приложения.
Как отобразить правильное дерево вызовов?
![enter image description here]()
Ответы
Ответ 1
Возможности
- Настройки Profiler исключают ваши классы. Измените исключение в настройках Profiler.
- Ваше приложение простаивало во время работы профайлера. Затем прикрепите профилировщик, чтобы программа выполнила код, который вы хотите профилировать.
- Возможно, вы профилируете неправильную JVM. RMI упрощает вызов в другую JVM. Возможно, вам нужно профилировать другую сторону этого соединения RMI.
На вкладке "Профайлер" есть флажок "Настройки". Если вы проверите окно "Настройки", появится еще одна панель, которая позволит вам настроить, какие классы собирает данные профилировщика.
Вот скриншот.
![screeshot of jvisualvm with Profiler "Settings" box checked.]()
Ответ 2
Как сказал @Holger, профайлер/пробоотборник снимки должны показывать только текущие потоки. Тем не менее, по личному опыту я обнаружил, что выборки снимков иногда показывают больше потоков, профилирующих их.
Кроме того, сэмплер VisualVM позволяет вам видеть каждое время CPU в реальном времени (без снятия моментального снимка), независимо от того, работает ли он, спать, ждать или контролировать.
Я не понимаю, почему это происходит, поскольку профилирование должно быть более точным, чем выборка (см. здесь разницу), но это так.
В целом, я бы рекомендовал попробовать пробник и посмотреть, работает ли он.
Ответ 3
Дерево вызовов показывает только потоки, которые действительно выполнялись во время выборки/профилирования (не спали все время), а следы стека стека не полностью отфильтровывались. Фильтр устанавливается перед началом выборки или профилирования. При включении "настроек" в правом верхнем углу вы можете настроить фильтр. В случае сэмплера вы также можете настроить частоту дискретизации, которая является компромиссом между производительностью и риском для контроля за состоянием потока. Но может быть, что ваше приложение действительно простаивало во время профилирования. Тогда единственными потоками, которые вы видите, являются потоки RMI, поддерживающие соединение с VisualVM.