线上出问题了(接口慢、报错、内存涨),怎么快速定位?这篇快速入门:排查思路(套路化流程)+ 神器 Arthas(在线诊断 Java,不用重启)。
一、解决什么问题:线上问题不能"想当然"
线上问题特征:环境复杂、不能随便重启、日志可能不全。排查要有套路,不能瞎猜:
① 看监控(是不是整体挂了?)→ ② 看日志(报什么错?)→ ③ 定位到代码 → ④ 修复验证二、排查四步法
① 看监控(《Prometheus》):CPU/内存涨了?错误率升了?哪个服务?——先定位"在哪"
② 看日志(《日志收集》):按 traceId 搜该请求的全链路日志,看报什么错——定位"为什么"
③ 定位代码:日志指向哪个方法?参数是什么?——定位"哪段代码"
④ 修复验证:改代码 → 发版 → 看监控回落
三、神器:Arthas(Java 在线诊断)
Arthas 是阿里开源的 Java 诊断工具——挂到运行中的进程上,不用重启就能查:
bash
java -jar arthas-boot.jar # 启动,选择要诊断的进程
# 常用命令
dashboard # 总览:线程、内存、CPU 概况
thread -n 3 # 最忙的 3 个线程(查死循环/阻塞)
trace com.example.OrderService pay # 跟踪 pay 方法,看每步耗时(查慢在哪)
watch com.example.OrderService pay '{params, returnObj}' # 看入参和返回值
jad com.example.OrderService # 反编译线上代码,确认线上跑的版本典型场景:接口突然慢 → trace 看哪一步耗时最高 → 发现是数据库查询慢 → 查 SQL。
四、其他常用手段
| 手段 | 场景 |
|---|---|
jstack | 看线程栈(死锁、卡死) |
jmap -heap | 看堆内存(OOM 排查) |
| dump + MAT | 内存溢出时导出堆快照分析 |
| 开关/降级 | 紧急止血:关掉故障功能,先恢复再说 |
小结
- 排查套路:监控 → 日志 → 代码 → 修复验证
- Arthas 在线诊断:dashboard / thread / trace / watch / jad,不用重启
- 紧急情况先"止血"(降级/开关),再慢慢查根因
- 日志要带 traceId,才能全链路串起来
想了解更系统的可观测性(指标+日志+链路三位一体),看「监控告警与日志收集」(文章整理中)。
