博客
关于我
如何用火焰图进行 Java 性能分析,这一篇文章就够了
阅读量:798 次
发布时间:2023-04-02

本文共 1714 字,大约阅读时间需要 5 分钟。

火焰图:性能分析的利器

作为一名开发人员,性能优化是我们每天都需要面对的挑战。CPU 使用率飙升,应用响应变慢,这些问题往往需要我们深入分析代码执行路径。传统的调试方法往往依赖主观猜测,这显然效率低下。而火焰图(Flame Graph)作为性能分析的利器,能够快速定位问题所在,让我们不再“瞎蒙”。


一、火焰图简介

火焰图是一种基于调用栈信息的可视化工具,用于展示CPU执行情况。它通过图形化的方式,直观地呈现程序执行路径,从而帮助我们快速定位性能瓶颈。

火焰图的含义

  • y轴:表示调用栈深度。顶部是正在执行的函数,底部是其父函数。
  • x轴:表示抽样次数。宽度越大,说明该函数执行时间越长。
  • 颜色:通常使用暖色调表示CPU繁忙程度,颜色没有特别含义。
  • 平顶(Plateaus):火焰形状的稳定部分,可能是性能问题的关键区域。

二、火焰图的实战应用

1. 安装perf命令

perf是Linux系统原生性能分析工具,可以提供函数执行情况及调用栈信息。安装步骤如下:

sudo apt install linux-tools-common

安装完成后,输入以下命令查看版本:

perf -v

2. 下载 FlameGraph

从GitHub获取 FlameGraph 源码:

git clone https://github.com/brendan-gregg/flame-graph.git

3. 运行 Java 项目

准备一个简单的SpringBoot项目,放在 FlameGraph 目录下。启动项目:

java -jar springboot-hello-0.0.1-SNAPSHOT.jar

4. 运行 perf 采集数据

查看 Java 进程号

jps -l

开始采集

sudo perf record -F 99 -p 进程号 -g -- sleep 30
  • -F 99:每秒采样99次。
  • -p 进程号:指定目标进程。
  • -- sleep 30:采集30秒。

5. 生成 SVG 火焰图

解析数据

perf script -i perf.data > perf.unfold

生成火焰图

sudo FlameGraph/stackcollapse-perf.pl perf.unfold > perf.foldedsudo FlameGraph/flamegraph.pl perf.folded > perf.svg

三、火焰图的解析

1. 火焰图的互动性

  • 鼠标悬浮:显示函数名称、抽样次数及百分比。
  • 点击放大:放大特定层,查看详细信息。
  • 搜索功能:支持 Ctrl+F 快速定位函数。

四、红蓝分叉火焰图

红蓝分叉火焰图用于对比修改前后性能变化。通过颜色差异,快速定位性能问题。

生成红蓝分叉火焰图

  • 抓取数据
  • sudo perf record -F 99 -a -g -- sleep 30
    1. 解析并生成火焰图
    2. sudo FlameGraph/stackcollapse-perf.pl out.folded1 > out.foldedsudo FlameGraph/difffolded.pl out.folded1 out.folded2 > diff.svg

      五、生成 Java 堆栈火焰图

      1. 下载 perf-map

      git clone https://github.com/jvm-profiling-tools/perf-map-agent.git

      2. 编译

      cmake .make

      3. 生成火焰图

      sudo perf record -F 99 -ag -p 进程号 -- sleep 30./FlameGraph/jmaps

      六、Arthas 火焰图

      Arthas 是 Alibaba 开发的性能分析工具,支持火焰图生成,操作简便。

      • 官网:https://github.com/alibaba/arthas
      • 使用文档:https://alibaba.github.io/arthas/profiler.html

      七、参考资料

    转载地址:http://mlefk.baihongyu.com/

    你可能感兴趣的文章
    OSG学习:几何对象的绘制(二)——简易房屋
    查看>>
    OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
    查看>>
    OSG学习:场景图形管理(一)——视图与相机
    查看>>
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(二)——单窗口多相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>
    OSG学习:纹理映射(一)——多重纹理映射
    查看>>
    OSG学习:纹理映射(七)——聚光灯
    查看>>
    OSG学习:纹理映射(三)——立方图纹理映射
    查看>>
    OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
    查看>>
    OSG学习:纹理映射(五)——计算纹理坐标
    查看>>
    OSG学习:纹理映射(六)——灯光
    查看>>
    OSG学习:纹理映射(四)——三维纹理映射
    查看>>
    OSG:从源码看Viewer::run() 一
    查看>>
    osi 负载均衡
    查看>>
    OSI七层模型与TCP/IP五层模型(转)
    查看>>
    OSI七层模型与TCP/IP四层与五层模型详解
    查看>>