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

Я ищу профилировщик кода Java, который я могу использовать для профилирования моего приложения (его службы, которая работает в бэкэнде) при производстве (значит, это означает, что он слишком мал, и он не должен замедлять мое приложение). Прежде всего, я хочу обработать дерево профилей, то есть, если() вызывает 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, который можно использовать для производства без ущерба для производительности?

Ответ 1

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

enter image description here

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Посмотрите perfspy (учебник), он может уже сделать из коробки то, что вам нужно.

по теме: