0

我正在尝试查看 jvm 支持的分析事件列表。如文档中所述,我使用了list如下所示的命令 -

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

在此处输入图像描述

有人可以让我知道如何查看特定 jvm 的 aysnc-profiler 支持的所有事件列表吗?如果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)
4

1 回答 1

3

malloc这不是一个单独的事件。这只是一个执行断点的例子。

在硬件断点的帮助下,async-profiler可以跟踪对任何内存位置的访问。对硬件断点使用类似 perf 的语法,您可以选择分析代码中任何给定地址的执行情况:

./profiler.sh -e mem:0x123450:x <pid>

可以指定本机函数名称,而不是数字地址。malloc只是标准 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 帮助中将它们全部列出。

于 2021-06-28T13:01:11.480 回答