干货:程序员必备性能分析工具——Arthas火焰图

前 言

上次写完这篇《干货:一行JVM参数,帮我拯救了90%的CPU》文章后,就有小伙伴私信咨询火焰图是怎么生成的,如何通过火焰图分析系统问题?今天我就分享一个超实用的Java性能分析工具------Arthas。

什么是Arthas?

Arthas是阿里巴巴开源的Java诊断工具,可以在不重启应用的情况下,对线上问题进行实时诊断。

想象一下,当我们的应用突然CPU或内存飙高,你是不是第一想到的动作就是重启服务呢?当然我们不能直接重启服务丢失现场,这时候Arthas就可以像一名随时待命的"外科医生",能直接对运行中的Java进程进行"诊断手术"。

为什么需要火焰图?

那么火焰图又是什么呢?火焰图是一种可视化性能分析工具,由Brendan Gregg发明。它之所以叫"火焰图",是因为整个图表看起来像一团火焰,它的最大价值在于直观,可以通过图形化的方式,让我们一眼就能看出哪些函数消耗的资源最多。

手把手教你生成火焰图

1. 安装和启动Arthas

首先,我们需要下载Arthas,并启动它

复制代码
# 下载Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar

# 启用Arthas
java -jar arthas-boot.jar
复制代码

启动后,Arthas会列出当前机器上所有的Java进程,我们只需要输入对应的序号,就能连接到目标进程,比如小编要诊断ID为97519的进程,输入"6"回车即可成功进入Arthas的命令行界面。

2. 生成火焰图

在Arthas的命令行界面,我们输入以下最关键的生成火焰图的命令,只需要三步,一个清晰的火焰图HTML文件就生成好了!

复制代码
# 开始采集CPU性能数据
[arthas@97519]$ profiler start
Started [cpu] profiling

# 查看采集状态
[arthas@97519]$ profiler status
[cpu] profiling is running for 15 seconds

# 停止采集并生成火焰图(HTML格式)
[arthas@97519]$ profiler stop --format html
OK
profiler output file: /Users/admin/02-Work/workspace_ai/cbs/contract-management-system/contract-backend/arthas-output/20251108-141833.html
复制代码

3. 查看结果

我们可以直接打开生成的HTML文件查看结果

如何读懂火焰图?

生成火焰图很简单,但更重要的是学会如何读懂它。很多人第一次看到火焰图会觉得眼花缭乱,其实只要掌握几个关键点就够了:

火焰图的结构很简单:

  • Y轴(垂直方向):表示调用栈深度,从上到下是函数调用关系,最顶层是正在执行的函数,下面是它的父函数

  • X轴(水平方向):表示资源占用比例,越宽的函数消耗越多CPU时间

  • 颜色:通常没有特殊含义,只是为了区分不同函数

关键观察点:

  1. 寻找"平顶":如果一个函数的顶部是平的(而不是尖的),那很可能就是性能瓶颈。因为这表示这个函数本身耗时较长,而不是它调用的其他函数耗时

  2. 关注最宽的部分:横轴越宽,表示该函数占用的CPU时间越多

  3. 从下往上看:底层函数被上层函数调用,所以分析时要理解调用关系

举个例子,假如你看到一个大平顶,上面标着java.util.zip.Deflater.deflateBytes,那很可能是因为压缩操作消耗了大量CPU时间。

bash 复制代码
# 采集内存性能数据
[arthas@97519]$ profiler start --event alloc

# 停止采集并生成火焰图(HTML格式)
[arthas@97519]$ profiler stop --format html

# 查看Arthas看板
[arthas@97519]$ dashboard

# 停止Arthas服务
[arthas@97519]$ stop

总 结

Arthas是一个强大且易用的性能分析工具,通过本文的介绍,希望大家能够以后性能优化不再靠"猜",而是有据可依。下次遇到性能问题,不妨试试Arthas火焰图,说不定几分钟就能解决之前困扰你几天的问题!

希望这篇干货能帮到你!你有没有用火焰图解决过什么有意思的问题?或者在使用中遇到了什么坑?欢迎在评论区留言分享,我们一起交流进步!

更多详细信息详见:https://arthas.aliyun.com/doc/quick-start.html

相关推荐
2601_96207157几秒前
类变量和全局变量的查找路径有什么区别?
开发语言·python
卷无止境1 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
\光辉岁月/1 小时前
5.java-数组
java·开发语言
Java后端的Ai之路1 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
计算机毕业编程指导师1 小时前
计算机毕设选题推荐:基于Hadoop与Spark的Steam游戏数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·steam游戏
计算机毕业编程指导师1 小时前
【计算机毕设选题推荐】基于Hadoop+Spark的白鹿抖音评论大数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·抖音评论
谢亮_vipxieliang1 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
Zootopia6261 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
Y3815326621 小时前
搜索 API 延迟优化:并发数、超时与超时的真实代价
python·搜索引擎
时间的拾荒人2 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试