Files

53 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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. 生成火焰图**
```bash
# 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:
1. **初步定位**:使用 `dashboard` 或 `thread -n 3`,快速判断是CPU、内存还是线程问题。
2. **链路追踪**:如果某个接口慢,使用 `trace` 追踪该方法,找到耗时最长的子调用。
3. **数据观察**:对疑似有问题的方法使用 `watch`,观察其入参和返回值是否异常。
4. **深度分析**:如果发现是某个方法本身消耗大量CPU,使用 `profiler` 生成火焰图,从微观层面分析其内部调用热点。
5. **代码确认**:如有必要,使用 `jad` 反编译线上运行的类,确认代码逻辑。
如果你能告诉我你具体遇到了哪一类性能问题(例如CPU持续过高、接口延迟、内存缓慢增长),我可以为你提供更有针对性的排查思路和命令组合。