Генерация графиков пламени для выполнения всей программы Java - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь сгенерировать Flame Graph для Java-программы, используя perf-map-agent .Я знаю, что вы можете использовать perf-java-record-stack для записи данных для запущенного процесса.Я также узнал, что вы можете использовать скрипт jmaps в каталоге Flame Graph.Я нашел пример Брендана Грегга , а также пост переполнения стека , иллюстрирующий это.Однако ни в одном из этих примеров процесс Java не задан в качестве аргумента для perf record (что означает, что perf собирает трассировки стека для всей системы).

Я хочу записать данные профилирования для всего выполненияпрограмма (и желательно ничего другого).Есть какой-либо способ сделать это?Я пробовал:

perf record -a -g java -XX:+PreserveFramePointer <other JVM arguments> <my java program>; sudo ~/bin/brendangregg/FlameGraph/jmaps

, который отвечает:

[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 1.711 MB perf.data (3449 samples) ]
Fetching maps for all java processes...
Mapping PID 2213 (user malin):
wc(1):   2970   9676 156108 /tmp/perf-2213.map

всегда с одинаковым PID.Этот PID является запущенным процессом, а не тем, для которого я пытался записать данные.

1 Ответ

0 голосов
/ 17 июня 2019

Я думаю, что вы хотите:

  1. постоянно запускать perf record с -a -g, прежде чем запустить Java-приложение.
  2. запустить jmap в то время какприложение Java запущено, так что вы можете собирать связанные с JIT символы.
  3. Завершить perf record после завершения работы приложения Java.
  4. фильтрует вывод perf script по pid, который вас интересует. В то время ваш Java-процесс уже запущен, и вы знаете, какой это pid.(откройте вывод perf script, чтобы посмотреть, вы узнаете, как фильтровать)
  5. Запустите скрипт генерации пламенного графа.

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

...