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

Профилирование запущенного приложения Java в командной строке

Я часто запускаю Java-приложения с помощью VisualVM, но для работы на компьютере требуется X.

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

Поэтому я ищу решение, с помощью которого я могу профилировать использование ЦП методами запущенного Java-приложения из командной строки. Мне достаточно собрать данные на сервере, а затем собранные данные можно проанализировать на другом компьютере.

Обновить:

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

4b9b3361

Ответ 1

Приложение jvmtop - удобный инструмент для профилирования из командной строки. Не нужно останавливать jvm. Использование:

jvmtop.sh --profile <PID>

Будет выдавать вам вывод, который будет обновляться во время запуска приложения:

  Profiling PID 24015: org.apache.catalina.startup.Bootstrap
  36.16% (    57.57s) hudson.model.AbstractBuild.calcChangeSet()
  30.36% (    48.33s) hudson.scm.SubversionChangeLogParser.parse()
   7.14% (    11.37s) org.kohsuke.stapler.jelly.JellyClassTearOff.parseScript()
  ...

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

Если вы ищете что-то более визуальное, посмотрите на jvm-mon, который основан на jvmtop

Ответ 2

Можете ли вы собрать 10 или 20 образцов стека с jstack? Тогда, если Foo является методом, его общее использование времени - это доля образцов, содержащих его. Его использование ЦП - это доля тех образцов, которые не прерываются при вводе-выводе или системном вызове. Его "собственное время" представляет собой долю выборок, в которых она сама является конечной точкой.

Мне ничего не нужно. Я либо запускаю его под IDE и собираю их таким образом, либо использую что-то вроде jstack, которое моментально копирует стек запущенного приложения.

Это метод случайной паузы.

Ответ 3

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

$ java -Xrunhprof:cpu=samples,file=myprogram.hprof ...

Затем проверьте файл "myprogram.hprof" с помощью какого-либо инструмента с графическим интерфейсом (или инструмента веб-сервера, такого как jhat) или инструмента командной строки после завершения процесса (и файл будет создан в это время).

Если вы используете прием сигнала "QUIT", упомянутый fooobar.com/questions/138979/... то вы можете сгенерировать файл по своему усмотрению, не выходя из JVM (он, кажется, добавляется к предыдущему выходному файлу). Или дождитесь завершения процесса, и он сгенерирует файл.

Этот (встроенный) профилировщик делает выборку нечасто, поэтому, как правило, низкое замедление/влияние в целом.

ссылка: http://web.archive.org/web/20160623224137/https://thunderguy.com/semicolon/2004/04/18/profiling-a-java-program-easily/

Ответ 4

Мы использовали hprof на наших серверах, и это определенно лучше, чем sysouts, если вы не можете запустить полноценную сессию VisualVM.

Примеры использования hprof - это много:

Ответ 5

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

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

Другие коммерческие профилировщики, которые являются стабильными, но не моими фаворитами, являются YourKIT.

http://www.yourkit.com/

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

Ответ 6

Одним из способов профилирования "уже запущенной" JVM является объединение нескольких jstacks, взятых за определенное время.

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

Ответ 7

Наиболее точное профилирование может быть достигнуто с помощью https://github.com/jvm-profiling-tools/async-profiler.

Этот проект является профилировщиком выборки с низкими издержками для Java, который не страдает от проблемы смещения Safepoint. Он имеет специфичные для HotSpot API-интерфейсы для сбора следов стека и отслеживания распределения памяти. Профилировщик работает с OpenJDK, Oracle JDK и другими средами исполнения Java на основе HotSpot JVM.

Вот мой скрипт для установки и запуска из командной строки:

async-profiler.sh

if [ ! -d profiler ]; then
  mkdir profiler && cd profiler && curl -L https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.6-ea/async-profiler-1.6-ea-linux-x64.tar.gz | tar xvz
  echo 1 > /proc/sys/kernel/perf_event_paranoid
  echo 0 > /proc/sys/kernel/kptr_restrict
  #apt install openjdk-8-dbg
else
  cd profiler
fi

#jps

./profiler.sh -d 60 -f dump_'date +%Y-%m-%d_%H-%M-%S'.jfr 'jps -q'

Предполагается, что приложение запускается под одним и тем же пользователем, и в jps указан один PID процесса Java. Продолжительность профилирования составляет 60 секунд. Не требуется изменение параметров запуска приложения или перезапуск приложения.

Графический интерфейс для проверки дампов встроен в IntelliJ IDEA Ultimate: https://www.jetbrains.com/help/idea/cpu-profiler.html.