火焰图作为一个可视化的工具,着重表达的信息是: 父子之间的关系,每一个块的占比。

火焰图有从上向下从下向上的,本质是相同的,只是方块之间的关系方向不同。

  • 从上向下:下面的方块是上面的子块
  • 从下向上:上面的方块是下面的子块

以从上到下为例:

  • 每一个方块,都是一个函数吗,方块的宽度,就表示函数消耗的时间占比(如果是内存火焰图,那就表示的这个函数申请的内存占比。所以我们看火焰图,主要是去找最宽的一个方块
  • 上下堆叠在一起的是表示函数调用,Y轴表示调用的深度。

查看火焰图注意点:

  • Y轴的深度一般不是问题,我们用火焰图主要是排查性能问题,是要找消耗时间长的地方。调用深度很深,但是也没花多少时间,一般不要紧。
  • 颜色(几乎没有意义。不是说颜色越深时间越久。颜色只是为了区分出来不用的块而已。一般会将相同名字的函数都使用同一个颜色,这样,即使他们分散在不同的 stack 中,也能清晰看出总时间比较高。FlameGraph 中颜色是根据 function 名随机生成的。但是有一种优化:比如对于Java的JVM来说,可以用不同的红色表示 Java 代码消耗的时间。可以用黄色表示 Kernel 消耗的时间,用蓝色表示 JIT 时间。但是不同的红色,红色深浅,还是没有什么意义的。
  • 方块之间的顺序没有意义。因为火焰图的生成方式和渲染方式,导致火焰图方块之间的顺序是没有意义的,不代表函数调用的顺序。

资料来源: