Skip to content

线上出问题了(接口慢、报错、内存涨),怎么快速定位?这篇快速入门:排查思路(套路化流程)+ 神器 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,才能全链路串起来

想了解更系统的可观测性(指标+日志+链路三位一体),看「监控告警与日志收集」(文章整理中)。