Профилирование недолговечных приложений Java - PullRequest
8 голосов
/ 17 апреля 2010

Существует ли какой-либо профилировщик Java, который позволяет профилировать недолговечные приложения? Профилировщики, которые я нашел до сих пор, похоже, работают с приложениями, которые продолжают работать до завершения работы пользователя. Тем не менее, я хочу профилировать приложения, которые работают как утилиты командной строки, они запускаются и выходят немедленно. Такие инструменты, как visualvm или NetBeans Profiler, даже не распознают, что приложение было запущено.

Я ищу что-то похожее на cProfile в Python, в котором результат профилировщика возвращается при выходе из приложения.

Ответы [ 10 ]

8 голосов
/ 17 апреля 2010

Вы можете профилировать свое приложение, используя встроенную в JROM HPROF.

Предоставляется два метода:

  1. выборка активные методы в стеке
  2. синхронизация время выполнения метода с использованием введенного байт-кода (BCI, внедрение байтового кода)

Sampling

Этот метод показывает, как часто методы находились на вершине стека.

java -agentlib:hprof=cpu=samples,file=profile.txt ...

Сроки

Этот метод подсчитывает фактические вызовы метода. Код инструмента был введен JVM заранее.

java -agentlib:hprof=cpu=times,file=profile.txt ...

Примечание: этот метод значительно замедлит время выполнения.


Для обоих методов имя файла по умолчанию - java.hprof.txt, если опция file= отсутствует.

Полная помощь может быть получена с помощью java -agentlib:hprof=help или может быть найдена в Документация по Oracle,

5 голосов
/ 17 апреля 2010

Sun Java 6 имеет переключатель java -Xprof, который предоставит вам некоторые данные профилирования.

-Xprof            output cpu profiling data
4 голосов
/ 17 апреля 2010

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

4 голосов
/ 17 апреля 2010

Профилирование коротко работающих Java-приложений имеет пару технических трудностей:

  • Инструменты профилирования обычно работают путем периодической выборки регистра SP процессора или ПК, чтобы увидеть, где в данный момент выполняется приложение. Если ваша заявка недолговечная, для получения точного изображения может быть взято недостаточно образцов.

Вы можете решить эту проблему, изменив приложение так, чтобы оно запускалось несколько раз в цикле, как предлагает @Mike. У вас будут проблемы, если ваше приложение вызовет System.exit(), но главная проблема заключается в ...

  • Характеристики производительности недолговечного Java-приложения могут быть искажены эффектами разогрева JVM. Много времени будет потрачено на загрузку классов, необходимых вашему приложению. Затем ваш код (и код библиотеки) будет немного интерпретироваться, пока JIT-компилятор не выяснит, что нужно скомпилировать в нативный код. Наконец, JIT-компилятор потратит время на выполнение своей работы.

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

Возвращаясь к моему предыдущему пункту ... если вы запускаете недолговечное приложение в цикле, вы фактически делаете что-то, что изменяет его обычный шаблон выполнения и удаляет компонент прогрева JVM. Поэтому, когда вы оптимизируете метод, который занимает (скажем) 50% времени выполнения в модифицированном приложении, это действительно 50% времени без учета разогрева JVM . Если разогрев JVM использует, скажем, 80% времени выполнения, когда приложение выполняется нормально, вы фактически оптимизируете 50% из 20% ... и это не стоит усилий.

2 голосов
/ 17 апреля 2010

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

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

с этим подходом вы можете профилировать все виды вещей из потоков, памяти, процессора, времени / продолжительности вызова метода / класса ...

http://profiler.netbeans.org/

2 голосов
/ 17 апреля 2010

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

1 голос
/ 04 марта 2012

Вы можете использовать запись измерений (измерений): http://www.jinspired.com/site/case-study-scala-compiler-part-9 Вы также можете просмотреть полученные снимки: http://www.jinspired.com/site/case-study-scala-compiler-part-10

Отказ от ответственности: я являюсь архитектором JXInsight / OpenCore.

1 голос
/ 17 апреля 2010

Java * Profile1 SD может захватывать данные подсчета выполнения блоков операторов независимо от того, насколько короток ваш прогон. Относительный подсчет выполнения покажет вам, на что потрачено время.

0 голосов
/ 17 апреля 2010

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

0 голосов
/ 17 апреля 2010

Я предлагаю вам попробовать yourkit. Он может профилировать с самого начала и выводить результаты после завершения программы. Вы должны заплатить за это, но вы можете получить eval лицензию или использовать версию EAP без таковой. (Ограничено по времени)

...