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

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

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

10 ответов


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

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

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

забора

этот метод показывает, как часто методы были найдены на вершине стек.

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

времени

этот метод подсчитывает фактические вызовы метода. Инструментальный код был введен JVM заранее.

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

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


для обоих методов именем файла по умолчанию является java.hprof.txt Если нет.

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


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

-Xprof            output cpu profiling data

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


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

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

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

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

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

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


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


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

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

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

http://profiler.netbeans.org/


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


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

отказ от ответственности: я архитектор JXInsight / OpenCore.


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


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