火焰圖是分析應用性能問題很好的工具,只是網上的文章都是講述分析 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