火焰图是分析应用性能问题很好的工具,只是网上的文章都是讲述分析 C, C++ 等语言的,对Java 语言描述甚少,此处记录一下本身使用火焰图分析Java 栈的过程。html
Linux: centos6 jdk: 1.7java
火焰图是性能大神 brendangregg 创造的,咱们使用的脚本在他的github 上 https://github.com/brendangregg/FlameGraph.git , 将项目clone 到本地,进入到 FlameGraph 文件夹中,建立两个文件(文件来自mik01aj 的gist,稍微修改了一下)linux
profile.sh:git
#!/bin/sh # Usage: ./profile.sh pid output.txt PROFILED_PID=$1 OUTPUT_FILE=$2 echo "Getting stacktraces from process $PROFILED_PID... Will stop on ^C or when the process exits." rm -f "$OUTPUT_FILE" while true; do jstack "$PROFILED_PID" >> "$OUTPUT_FILE" && sleep 0.01 || break done echo echo "Done! Stacks saved to $OUTPUT_FILE"
gen.sh:github
#!/bin/bash # Usage: ./gen.sh collected-stacks.txt TMPSTACKS=/tmp/flamegraph-stacks-collapsed.txt TMPPALETTE=/tmp/flamegraph-palette.map ./stackcollapse-jstack.pl --no-include-tname $1 > $TMPSTACKS # 1st run - hot: default ./flamegraph.pl --cp $TMPSTACKS > stacks.svg # 2nd run - blue: I/O cp palette.map $TMPPALETTE cat $TMPPALETTE | grep -v '\.read' | grep -v '\.write' | grep -v 'socketRead' | grep -v 'socketWrite' | grep -v 'socketAccept' > palette.map ./flamegraph.pl --cp --colors=io $TMPSTACKS > stacks.svg rm -f palette.map echo "Done! Now see the output in stacks.svg"
而后将stacks.svg 下载到本地,使用浏览器打开便可。ubuntu
原本参考了1 想使用perf
来生成采样信息,可是安装了一大堆东西以后,采样后的数据(采样脚本 perf record -F 99 -p 98498 -- sleep 30; ./jmaps
)一直报perf file's data size field is 0 which is unexpected.
, 也没有找到解决办法,加上 -v
以后会打印一个 couldn't open /proc/21847/status
的错误,不知道为何会读取这个进行的状态,应该说只读取采样进程的状态就能够了。后来直接使用网上的命令perf record -F 99 -a -- sleep 30; ./jmaps
,能够采样出来,可是生成的火焰图没法看,是系统栈与java栈混在一块儿并且 Java 栈的信息很模糊,不可用。centos