Skip to content

问题排查:让告警变成线索

告警来了——服务响应慢了、CPU 飙升了、OOM 了...

大多数人的第一反应是重启。重启能解决一时,但根本问题还在,下次还会发生。

排查问题的思路比工具更重要。

排查思路

四步法则

  1. 复现:确认问题能稳定复现
  2. 定位:缩小问题范围,锁定到具体模块
  3. 分析:找到根本原因
  4. 修复:修复并验证

从日志开始

日志是排查问题的第一手资料:

bash
# 查看错误日志
grep -E "ERROR|Exception" application.log

# 查看指定时间范围内的日志
grep "2026-03-22 14:00" application.log

# 统计错误数量
grep -c "ERROR" application.log

# 查看某用户的请求日志(结构化日志)
grep "userId=10001" application.log

从线程入手

如果是响应慢、CPU 高的问题,先看线程:

java
// JMX 线程信息
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = threadMXBean.dumpAllThreads(false, false);
for (ThreadInfo info : infos) {
    System.out.println(info.getThreadName() + " - " + info.getThreadState());
    if (info.getBlockedTime() > 0) {
        System.out.println("Blocked: " + info.getThreadName()
            + " 阻塞了 " + info.getBlockedTime() + "ms");
    }
}

从内存入手

如果是 OOM,先看内存:

bash
# 查看堆使用
jmap -heap <pid>

# 查看对象统计
jmap -histo <pid> | head -30

# 生成堆转储
jmap -dump:format=b,file=heap.hprof <pid>

生成的 .hprof 文件用 MAT 或 VisualVM 打开,可以分析大对象和内存泄漏。

常用工具

工具用途
Arthas在线诊断,不重启
jstack线程堆栈分析
jmap堆内存分析
jstatGC 统计
MAT堆转储分析
VisualVM性能分析

常见问题排查

1. 响应慢

bash
# 1. 用 Arthas trace 追踪耗时
trace com.example.OrderService createOrder '#cost > 100'

# 2. 查看数据库慢查询
# 3. 查看外部服务调用耗时
# 4. 检查连接池配置

2. CPU 高

bash
# 1. 找到占用 CPU 最高的线程
top -Hp <pid>

# 2. 导出堆栈,定位代码
jstack <pid> > stack.log

3. OOM

bash
# 1. 生成堆转储
jmap -dump:format=b,file=heap.hprof <pid>

# 2. 用 MAT 分析

总结

  1. 先看日志:大多数问题从日志里能找到答案
  2. 四步排查:复现→定位→分析→修复
  3. 工具辅助:Arthas 是生产环境的瑞士军刀
  4. 记录复盘:解决后复盘,积累经验

排查问题的能力,是区分普通工程师和资深工程师的关键标志。

基于 VitePress 构建