async-profiler просматривает список событий профилирования, поддерживаемых jvm
Я пытаюсь просмотреть список событий профилирования, поддерживаемых jvm. Как упоминалось в документе, я использовал команду, как показано ниже -
root@vrni-platform:/home/ubuntu/async-profiler-2.0-linux-x64# ./profiler.sh list 10208
Basic events:
cpu
alloc
lock
wall
itimer
Java method calls:
ClassName.methodName
Perf events:
page-faults
context-switches
cycles
instructions
cache-references
cache-misses
branches
branch-misses
bus-cycles
L1-dcache-load-misses
LLC-load-misses
dTLB-load-misses
mem:breakpoint
trace:tracepoint
Я не вижу событий, упомянутых в этом ответе, в приведенных выше выходных данных. Но если я выполню вышеуказанные события, как указано в этом ответе, похоже, что это сработает.
root@vrni-platform:/home/ubuntu/async-profiler-2.0-linux-x64# ./profiler.sh -e malloc -d 30 -f /tmp/flamegraph.html 10208
Profiling for 30 seconds
Done
Может ли кто-нибудь сообщить мне, как я могу просмотреть список всех событий, поддерживаемых aysnc-profiler для определенного jvm? Если
list
правильный аргумент в пользу
profiler.sh
тогда почему malloc и т. д. отображаются под списком всех событий?
Среда
ubuntu@vrni-platform:~/async-profiler-2.0-linux-x64# ./profiler.sh --version
Async-profiler 2.0 built on Mar 14 2021
Copyright 2016-2021 Andrei Pangin
ubuntu@vrni-platform:~/async-profiler-2.0-linux-x64# uname -a
Linux vrni-platform 4.15.0-142-generic #146-Ubuntu SMP Tue Apr 13 01:11:19 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
ubuntu@vrni-platform:~/async-profiler-2.0-linux-x64$ java -version
openjdk version "11.0.11" 2021-04-20 LTS
OpenJDK Runtime Environment Zulu11.48+22-SA (build 11.0.11+9-LTS)
OpenJDK 64-Bit Server VM Zulu11.48+22-SA (build 11.0.11+9-LTS, mixed mode)
1 ответ
вот это не отдельное мероприятие. Это просто пример точки останова на выполнение.
async-profiler с помощью аппаратных точек останова может отслеживать доступ к любой области памяти. Используя на синтаксис, похожийperf, для аппаратных точек останова, вы можете профилировать выполнение любого заданного адреса в коде:
./profiler.sh -e mem:0x123450:x <pid>
Вместо числового адреса можно указать собственное имя функции. это просто имя функции в стандартной библиотеке C (libc):
./profiler.sh -e mem:malloc:x <pid>
А также
-e malloc
- это ярлык для описанного выше дескриптора события. Если async-profiler обнаруживает, что данное имя события соответствует некоторой собственной функции, он профилирует выполнение этой функции.
Вместо
malloc
, вы также можете профилировать любую другую функцию. Например,
-
-e pthread_start
чтобы узнать, кто запускает новые потоки (как Java, так и собственные потоки); -
-e connect
профилировать новые соединения сокетов; -
-e JVM_GC
найти абонентовSystem.gc()
; -
-e G1CollectedHeap::humongous_obj_allocate
профилировать огромные распределения G1; -
-e Deoptimization::uncommon_trap
найти, где деоптимизируется скомпилированный код;
и так далее и тому подобное. В JVM, в стандартной библиотеке классов, в libc есть тысячи собственных функций. Очевидно, что перечислить их все в справке async-profiler практически невозможно.