Профилирование Java-приложений

Я ищу профилировщик кода Java, который я могу использовать для профилирования моего приложения (это служба, которая работает в бэкэнде) на производстве (так что это означает низкие затраты, и это не должно замедлять работу моего приложения). В первую очередь я хочу вызвать профилирование дерева, то есть, если a () вызывает b (), а затем b () вызывает c (), то сколько времени заняло a () b () и c (), как включительно, так и исключительно.

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

Кроме того, я прошел через metrics (https://github.com/dropwizard/metrics), но он не дает мне возможности профилировать дерево вызовов.

Callgrind (http://valgrind.org/docs/manual/cl-manual.html) - это то, что мне нужно, поскольку она предоставляет функциональные возможности профилирования дерева вызовов и дополнительные параметры, такие как предотвращение циклов вызовов (рекурсия). Но я не уверен, что Callgrind можно использовать в производственной среде, поскольку он сбрасывает данные при завершении программы.

Может ли кто-нибудь предложить хороший профилировщик дерева вызовов для java, который можно использовать в производстве без ущерба для производительности?


person Arry    schedule 07.03.2014    source источник
comment
Если я правильно помню, вы можете получить больше информации от другой JVM, такой как JRockit. Однако я основываю это на смутном воспоминании о прошедших годах.   -  person nablex    schedule 07.03.2014
comment
Вы помните, что функция профилирования JRockit была включена в Oracle JVM версии 7u40 +. См. Мой ответ о системе управления полетами и бортовом регистраторе ниже.   -  person kc2001    schedule 12.03.2014


Ответы (4)


Взгляните на Java Mission Control в сочетании с Flight Recorder. Начиная с выпуска Oracle JDK 7 Update 40 (7u40), Java Mission Control поставляется вместе с JVM HotSpot, поэтому он имеет высокую степень интеграции и, как предполагается, оказывает небольшое влияние на производительность во время выполнения. Я только начал смотреть на это, и я действительно вижу некоторые функции дерева вызовов.

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

person kc2001    schedule 11.03.2014
comment
Имейте в виду, что Mission Control и Flight Recorder не являются бесплатными программами. Вы должны заплатить Oracle, чтобы использовать его. - person Sebastian Häni; 20.12.2016
comment
Судя по всему, в 2018 году Mission Control стал open source. См. reddit.com/r/java/comments/8h9m9t/. - person kc2001; 07.11.2018

Как правило, вы не используете (или я не рекомендую) профилировщики, которые используют ваше приложение. КИП всегда означает неконтролируемые накладные расходы на производство.

Что вы можете использовать, так это профилировщик выборки. Профилировщик выборки делает снимок трассировки стека с контролируемым интервалом. Чего вы не получаете, так это количества вызовов, но по прошествии некоторого времени вы получаете хороший обзор, где у вас есть горячие точки. Поскольку вы можете настроить интервал выборки профилировщика, вы можете повлиять на его накладные расходы.

Полезный профилировщик выборки поставляется с JDK, см. Страницу hprof в документации по java 7. Раньше существовали некоторые инструменты графического анализа трассировок процессора hprof (а не трассировок кучи). Теперь их больше нет. Однако вы уже можете работать с созданным текстовым файлом.

Я бегло ознакомился с упомянутым выше материалом Java Mission Control. Я думаю, что это достаточно мощно и удовлетворит множество потребностей, в официальном документе говорится, что накладные расходы у него всего 2%. Однако это не совсем то, что мне нужно или чего я хочу. Для моих приложений лучше иметь постоянно включенное «легкое» профилирование.

person cruftex    schedule 12.03.2014

Intel Amplifier XE http://software.intel.com/en-us/intel-vtune-amplifier-xe имеет низкие накладные расходы, если они заметны. В нем используется технология отбора проб, чтобы свести к минимуму воздействие, и он может присоединяться и отсоединяться от непрерывных производственных процессов. Вам даже не нужно иметь источники во время профилирования, вы можете погрузиться в источники позже, после просмотра результатов о производительности в автономном режиме.

person Andrew    schedule 08.03.2014
comment
Примечание. Хотя на первый взгляд это может не выглядеть как инструмент для Java, он поддерживает Java. - person Aaron Digulla; 10.03.2014

Я не знаю ни одного инструмента, который может выполнять профилирование без снижения производительности.

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

Инструмент времени загрузки, такой как AspectJ, может добавлять эти вызовы во время выполнения, что позволит вам легко выбирать методы, которые вы хотите отслеживать, без постоянного изменения исходного кода.

Используя аспект around, вы даже можете добавить регистрацию времени, чтобы вам не приходилось анализировать журналы и пытаться найти соответствующие записи в журнале. Подробнее см. это сообщение в блоге < / а>.

Взгляните на perfspy (tutorial), он может уже делать из коробки то, что вам нужно.

Связанный:

person Aaron Digulla    schedule 07.03.2014
comment
Аспект отличный! Но использование аспекта для вызова профилирования дерева будет чрезмерным и может повлиять на производительность приложения. Вы так не думаете? - person Arry; 07.03.2014
comment
Да, я сказал именно это в первом предложении. Вы можете попытаться сплести аспект только в нескольких местах; часто достаточно высокоуровневого метода, чтобы увидеть, в какой части кода тратится большая часть производительности. Всегда помните, что 80% кода достаточно. Вам необходимо определить те 20%, на которые тратится 80% времени. Я также хотел, чтобы было простое решение в один щелчок, но я его еще не видел. - person Aaron Digulla; 10.03.2014