为整个Java程序执行生成火焰图

时间:2019-02-22 13:38:28

标签: java perf flamegraph

我正在尝试使用Flame Graph为Java程序生成perf-map-agent。我知道您可以使用perf-java-record-stack来记录正在运行的进程的数据。我还发现您可以在Flame Graph目录中使用脚本jmaps。我发现Brendan Gregg's examplea Stack Overflow post都对此进行了说明。但是,在这些示例中,没有一个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 :(得分:0)

我想您想要的是:

  1. 在启动Java应用程序之前,以perf record不断运行-a -g
  2. 在Java应用程序运行时运行jmap,以便您可以收集与JIT相关的符号。
  3. 在Java应用程序完成后结束perf record
  4. 通过您感兴趣的perf script过滤pid的输出。那时,您的Java进程已经在运行,您知道它是什么pid。 (打开perf script的输出以查看一下,您将知道如何过滤)
  5. 运行flamegraph生成脚本。

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