0

我正在尝试使用perf-map-agent为 Java 程序生成火焰图。我知道您可以使用它来记录正在运行的进程的数据。我还发现您可以使用Flame Graph 目录中的脚本。我找到了Brendan Gregg 的示例以及说明这一点的 Stack Overflow 帖子。但是,在这些示例中,Java 进程都没有作为参数给出(这意味着 perf 收集整个系统的堆栈跟踪)。perf-java-record-stackjmapsperf record

我想记录整个程序执行的分析数据(最好不要别的)。有没有办法做到这一点?我努力了:

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 是一个正在运行的进程,而不是我尝试为其记录数据的进程。

4

1 回答 1

0

我想你想要的可能是:

  1. 在 java 应用程序启动之前,不断地运行perf recordwith 。-a -g
  2. 在 Java 应用程序运行jmap时运行,以便您可以收集 JIT 相关符号。
  3. perf record在java应用程序完成后结束。
  4. 过滤你感兴趣的输出perf scriptpid那时,你的Java进程已经在运行,你知道它是什么pid。(打开输出perf script看看,就知道怎么过滤了)
  5. 运行火焰图生成脚本。

通过这种方式,您可以记录整个时间段的 Java 应用程序。

于 2019-06-17T20:48:25.340 回答