perf record -a -g -p 65269 -F 99 -- sleep 30
perf record -a -g -p 65269 -- sleep 30 (-p 后是pid号)
perf report -n --stdio (按cpu消耗降序全面展开)
perf report -i perf.data (按cpu消耗收起来展示,这个比较好用)
perf record -F 99 -p 进程ID -g -- sleep 60; ./FlameGraph/jmaps (使用jmaps脚本,自动的为所有Java进程创建符号文件
)
首先用 perf script 工具对 perf.data 进行解析
# 生成折叠后的调用栈
perf script -i perf.data &> perf.unfold
将解析出来的信息存下来, 供生成火焰图,首先用 stackcollapse-perf.pl 将 perf 解析出的内容 perf.unfold 中的符号进行折叠 :
# 生成火焰图
./stackcollapse-perf.pl perf.unfold &> perf.folded
最后生成 svg 图
./flamegraph.pl perf.folded > perf.svg
我们可以使用管道将上面的流程简化为一条命令
perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > process.svg
下载perf-map
http://www.github.com/jvm-profiling-tools/perf-map-agent
解压
进入解压后的目录
安装cmake
https://blog.csdn.net/hometing218/article/details/79516686
git clone https://github.com/jvm-profiling-tools/perf-map-agent
cd perf-map-agent
yum install cmake
yum install gcc
yum install gcc-c++
cmake .
make
必须确保jdk为1.8才能安装成功
同 jmaps 为java进程创建符号表 生成java堆栈的火焰图
java -cp attach-main.jar:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce PID
sudo chown root /tmp/perf-*.map
没有显示代码的顶层栈,奇怪,找文章看,只要在JVM启动参数里加上
-XX:+PreserveFramePointer --- 加上这个选项,再测试看看
顺便也加上这个 -XX:+NoOmitFramePointer
果然可以了,效果如下。
perf record -F 99 -p 进程ID -g -- sleep 60; ./FlameGraph/jmaps
执行前要设置perf-map的环境变量
export AGENT_HOME=/home/admin/tools/perf-map-agent-master
参考文献
https://www.jianshu.com/p/bea2b6a1eb6e
https://my.oschina.net/qiangzigege/blog/1301752