Профилирование недолговечных Java-приложений

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

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


person ejel    schedule 16.04.2010    source источник
comment
Если это недолго, зачем его профилировать? Весь толчок к профилированию возникает тогда, когда что-то отнимает слишком много времени, не так ли?   -  person Will Hartung    schedule 17.04.2010
comment
В данном случае термин «недолговечный», о котором я говорил, означает что-то вроде утилит командной строки, которые заканчиваются мгновенно после выполнения. Однако все же возможно, что они занимают слишком много времени для выполнения требований (например, 30 секунд, если предпочтительнее менее 5 секунд). Так что по-прежнему полезно точно определить, какие части являются узкими местами.   -  person ejel    schedule 17.04.2010


Ответы (10)


Вы можете профилировать свое приложение с помощью встроенной JVM HPROF.

Он предоставляет два метода:

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

Отбор проб

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

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 или найти в документации Oracles

person VHF    schedule 16.04.2010
comment
Я пробовал hprof, но кажется, что он может только сбрасывать профиль кучи. Знаете ли вы, можно ли также сбрасывать данные о времени процессора в файл? - person ejel; 20.04.2010
comment
Полностью переработан ответ на действующие стандарты сайта (добавлена ​​полезная информация / примеры) и исправлена ​​неработающая ссылка - person try-catch-finally; 26.08.2017
comment
Агент hprof был удален в java 9, JEP 240 - person user2418306; 07.09.2020

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

-Xprof            output cpu profiling data
person McDowell    schedule 17.04.2010
comment
Это очень быстрый способ получить приблизительную информацию. Хорошо знать! - person ejel; 20.04.2010

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

person Thorbjørn Ravn Andersen    schedule 17.04.2010

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

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

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

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

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

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

person Stephen C    schedule 17.04.2010
comment
+1 Хорошие комментарии. Относительно вашего первого пункта об инструментах профилирования я хотел бы только указать, что 1) выборка регистра ПК почти бесполезна (по сравнению с выборкой стека) во всех, кроме простейших программ, и 2) требуется не так много выборок, потому что точность измерение времени не требуется (при условии, что цель состоит в том, чтобы найти полезные моменты для оптимизации). Подробнее по этой теме: stackoverflow.com/questions/1777556/alternatives -to-gprof / - person Mike Dunlavey; 17.04.2010

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

person Mike Dunlavey    schedule 16.04.2010

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

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

при таком подходе вы можете профилировать все, что угодно: потоки, память, процессор, время / продолжительность вызова метода / класса ...

http://profiler.netbeans.org/

person kctang    schedule 17.04.2010

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

person Ira Baxter    schedule 17.04.2010

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

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

person William Louth    schedule 04.03.2012

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

person Peter Lawrey    schedule 16.04.2010

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

person Binil Thomas    schedule 16.04.2010