参考:如何读懂火焰图?

总结:
火焰图用来分析cpu耗时情况。

命令:
perf 命令,它是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。
通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。

命令例子:
sudo perf record -F 99 -p 13204 -g -- sleep 30
perf record		表示记录
-F 99			表示每秒99次
-p 13204		是进程号,即对哪个进程进行分析
-g				表示记录调用栈
sleep 30		表示持续30秒

但是由于该命令可读性太差,因此火焰图产生了。
火焰图是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈。
如下图:

火焰图

cpu火焰图分析 java 性能火焰图怎么看_条件语句

y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。

x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。
注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。

火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。

颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

火焰图例子:
首先,CPU 抽样得到了三个调用栈。
func_c 
func_b 
func_a 
start_thread 

func_d 
func_a 
start_thread 

func_d 
func_a 
start_thread

上面代码中,start_thread是启动线程,调用了func_a。后者又调用了func_b和func_d,而func_b又调用了func_c。
经过合并处理后,得到了下面的结果,即存在两个调用栈,第一个调用栈抽中1次,第二个抽中2次。

start_thread;func_a;func_b;func_c 1 
start_thread;func_a;func_d 2

另一火焰图例子,如下:
最顶层的函数g()占用 CPU 时间最多。d()的宽度最大,但是它直接耗用 CPU 的部分很少。b()和c()没有直接消耗 CPU。因此,如果要调查性能问题,首先应该调查g(),其次是i()。
另外,从图中可知a()有两个分支b()和h(),这表明a()里面可能有一个条件语句,而b()分支消耗的 CPU 大大高于h()。

cpu火焰图分析 java 性能火焰图怎么看_调用栈_02