我正在尝试使用Flame Graph为Java程序生成perf-map-agent。我知道您可以使用perf-java-record-stack
来记录正在运行的进程的数据。我还发现您可以在Flame Graph目录中使用脚本jmaps
。我发现Brendan Gregg's example和a 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是一个正在运行的进程,而不是我尝试为其记录数据的那个进程。
答案 0 :(得分:0)
我想您想要的是:
perf record
不断运行-a -g
。jmap
,以便您可以收集与JIT相关的符号。perf record
。 perf script
过滤pid
的输出。那时,您的Java进程已经在运行,您知道它是什么pid。 (打开perf script
的输出以查看一下,您将知道如何过滤)通过这种方式,您可以记录Java应用程序的整个时间段。