Подтвердить что ты не робот

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

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

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

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

Спасибо

Изменить jvisualvm выглядит как инструмент - он идентифицировал проблему примерно через 30 секунд. Мне просто нужно знать, что означает "самолюбие" в контексте профиля метода. Благодаря

4b9b3361

Ответ 1

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

Ответ 2

Самый простой способ - использовать -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>

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

* Не уверен относительно младшей версии

Ответ 5

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

Ответ 6

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

JProfiler: http://www.ej-technologies.com/products/jprofiler/overview.html

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

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

Ответ 7

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