Профилирование Java - как я могу получить метод анализа метода моего приложения? - PullRequest
27 голосов
/ 15 февраля 2010

Я хочу запустить свое Java-приложение и при заданной рабочей нагрузке увидеть:

  • сколько раз данная функция была вызвана
  • насколько дорог каждый вызов функции в относительном выражении (т.е. сколько времени занимает выполнение каждого)

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

Спасибо

Редактировать jvisualvm выглядит как инструмент - он выявил проблему примерно за 30 секунд. Мне просто нужно знать, что означает «selftime» в контексте профиля метода. Спасибо

Ответы [ 7 ]

21 голосов
/ 15 февраля 2010

Самый простой подход для программы, работающей на java 6 от Sun, состоит в использовании программы jvisualvm в jdk. Позволяет прикрепить и профиль без каких-либо специальных настроек.

13 голосов
/ 15 февраля 2010

Самый простой способ - использовать -prof, например: java -prof -jar yourjar.jar

Это напечатает файл с именем java.prof после завершения работы программы.

См. Страницу документации HPROF

В моем приложении я использую: -Xrunhprof: CPU = образцов, нить = у, лани = у

Это печатает отчет, который содержит, среди прочего, это:

CPU SAMPLES BEGIN (total = 55110) Sun Feb  7 17:02:51 2010
rank   self   accum   count  trace  method
1      69.68% 69.68%   38399 300361 java.net.SocketInputStream.socketRead0
2      24.40% 94.08%   13448 300386 java.net.SocketInputStream.socketRead0
3      0.20%  94.28%     108 300425 java.io.FileOutputStream.writeBytes
4      0.19%  94.47%     107 300976 java.net.PlainDatagramSocketImpl.receive0
5      0.19%  94.65%     102 300414 package.BlockingSampleBuffer.addSample
6      0.16%  94.82%      90 300365 java.net.SocketOutputStream.socketWrite0
7      0.16%  94.98%      89 300412 package.BlockingSampleBuffer.addSample
8      0.15%  95.13%      84 300430 java.lang.Object.wait
9      0.14%  95.27%      77 300592 java.io.FileOutputStream.writeBytes
10     0.14%  95.41%      76 300566 java.lang.AbstractStringBuilder.<init>

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

4 голосов
/ 02 декабря 2014

Java 1.7 * поставляется в комплекте с Java Mission Control (jmc), который имеет функцию «Flight Recorder», которую можно использовать для профилирования выполнения метода. Результаты профилирования отображаются почти так же, как и в AppDynamics - легко обнаружить проблемы с производительностью (особенно, какие методы поглощают весь процессор).

Хоть и не детально, но хороший пост в блоге, объясняющий о Flight Recorder: http://hirt.se/blog/?p=364

* Не уверен насчет вспомогательной версии

4 голосов
/ 15 февраля 2010

В списке было несколько профилировщиков (Eclipse one и JProfiler). Я просто хочу НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ, чтобы профилировщик был одним из инструментов вашего инструментария программирования.

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

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

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

Просто найдите один и используйте его в течение недели или двух, чтобы вы знали, что он предлагает.

2 голосов
/ 15 февраля 2010

Если вы готовы потратить немного денег,

JProfiler: http://www.ej -technologies.com / продукция / JProfiler / overview.html

очень хорошо, показывает процент использованного времени, использованного абсолютного времени и количество вызовов до уровня метода. Он понимает вызовы EJB, вызовы веб-служб и даже отображает SQL-вызовы jdbc. Я часто использую его для поиска проблем с производительностью.

У него тоже есть профилирование памяти, но я считаю, что профилирование процессора гораздо полезнее.

2 голосов
/ 15 февраля 2010

Взгляните на Eclipse TPTP . Они могут предоставить именно это и многое другое для любого приложения, запущенного из Eclipse.

1 голос
/ 14 декабря 2012

Именно здесь помогает АОП. Аспекты могут быть добавлены / удалены без изменения кода. Если вы используете Spring; создайте Aspect, включая JoinPoint, Advice, перечисляющий классы и общедоступные методы для оценки времени выполнения Добавьте эти компоненты в конфигурацию Spring. В противном случае используйте контейнер AspectJ для применения без пружины

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...