4.6 KiB
4.6 KiB
Arthas是一款功能强大的Java诊断工具,帮你快速定位线上应用问题。它的核心功能包括系统状态监控、方法调用追踪、性能热点分析以及动态代码修改等。
为了让你快速上手,我先用一个表格汇总其最常用的命令、核心功能和应用场景:
| 命令 | 核心功能与参数 | 典型应用场景 |
|---|---|---|
| dashboard | 实时显示JVM内存、线程、GC、系统负载等信息。 | 快速概览应用整体健康状态,初步判断CPU、内存或线程问题。 |
| thread | 查看所有线程状态。thread -n 3查看最忙的3个线程;thread id查看指定线程堆栈。 |
定位CPU飙高、线程死锁、线程卡顿。 |
| trace | 追踪方法内部调用路径,并统计每个节点的耗时。trace ClassName methodName。 |
分析接口或方法响应慢,找出内部调用的性能瓶颈。 |
| watch | 观察方法的入参、返回值或异常。watch ClassName methodName "{params, returnObj}"。 |
动态监测方法调用时的数据,用于排查参数异常或返回值错误。 |
| jad | 反编译已加载的类到源代码。jad --source-only ClassName。 |
确认线上运行的代码是否为预期版本,或在无源码时理解逻辑。 |
| sc | 查看JVM已加载的类信息。sc -d *ClassName*显示类详情(含ClassLoader)。 |
排查类找不到、类冲突,或为jad、mc等命令提供ClassLoader信息。 |
| heapdump | 生成JVM堆转储文件(.hprof)。 |
转储内存快照,供MAT、VisualVM等工具进行离线内存泄漏分析。 |
| profiler | 生成CPU/内存火焰图,分析性能热点。profiler start/profiler stop。 |
深度分析CPU占用过高或内存分配频繁的根本原因。 |
🔥 如何生成与分析火焰图
火焰图能直观展示CPU时间或内存分配在方法调用栈上的分布,是分析性能问题的利器。在Arthas中,主要通过 profiler命令(基于async-profiler)来实现。
1. 生成火焰图
# 1. 启动性能采样(默认采样CPU事件)
[arthas@12345]$ profiler start
# 可指定采样事件,如分析内存分配:profiler start --event alloc
# 2. 让应用运行一段时间(如执行某个压测或复现问题场景)
# 3. 停止采样并生成结果(默认生成HTML格式的火焰图)
[arthas@12345]$ profiler stop --format html
停止后,命令行会输出火焰图文件的保存路径,通常位于 arthas-output/ 目录下。
2. 查看火焰图
生成后,你可以直接在浏览器中打开该HTML文件。如果Arthas在本地运行,也可以通过其内置的HTTP服务访问:http://localhost:3658/arthas-output/。
3. 解读火焰图
- 看布局:火焰图是倒置的调用栈。每一层代表一个方法调用,下层是上层方法的调用者。
- 找热点:横向条块的宽度代表该方法的资源(如CPU时间)占用比例,越宽表示消耗越多。重点关注最顶部的**“平顶山”**(即一个较宽的方法条块出现在多个调用栈顶部),这通常是性能瓶颈所在。
- 分析路径:结合从下至上的调用链,可以定位到具体是哪条业务执行路径导致了高消耗。
💡 一些实用技巧
- 退出与重连:在Arthas会话中,输入
stop会完全退出Arthas;输入quit或exit仅退出当前会话,Attach的进程不受影响。 - 条件过滤:
watch和trace等命令支持条件表达式。例如,watch ... 'params[0]=="keyword"'可以只在第一个参数为特定值时触发观察。 - 批处理执行:可以将多个命令写入脚本文件,通过
as.sh -f your.as一次性执行,适合自动化检查。
🛠️ 典型问题排查流程参考
当遇到线上问题时,可以遵循以下步骤使用Arthas:
- 初步定位:使用
dashboard或thread -n 3,快速判断是CPU、内存还是线程问题。 - 链路追踪:如果某个接口慢,使用
trace追踪该方法,找到耗时最长的子调用。 - 数据观察:对疑似有问题的方法使用
watch,观察其入参和返回值是否异常。 - 深度分析:如果发现是某个方法本身消耗大量CPU,使用
profiler生成火焰图,从微观层面分析其内部调用热点。 - 代码确认:如有必要,使用
jad反编译线上运行的类,确认代码逻辑。
如果你能告诉我你具体遇到了哪一类性能问题(例如CPU持续过高、接口延迟、内存缓慢增长),我可以为你提供更有针对性的排查思路和命令组合。