目录
[接口报错 / RT 超时](#接口报错 / RT 超时)
[程序卡死 / CPU 飙高](#程序卡死 / CPU 飙高)
线上问题定位
接口报错看日志,分布式用 SBA/ELK;CPU 飙高用 top+jstack 或 Arthas;死锁用 jstack 或 Arthas
thread -b直接检测。
通用排查思路
项目上线后问题排查分两种情况:
-
有运维:运维拉取运行日志,开发结合日志 + 源码定位问题,修复后重新部署。
-
无运维:开发直接操作生产服务器,根据问题类型(接口报错、RT 超时、CPU 飙高、程序卡死、死锁、OOM 等)采用不同方案。
接口报错 / RT 超时
方案 1:日志定位(基础方案)
-
使用 Spring Boot 默认
logback,将error级别日志输出到文件; -
直接查看项目日志、Tomcat logs 或
logs文件夹,分析错误栈和调用链定位问题。
方案 2:监控工具排查(分布式系统)
① Spring Boot Admin(SBA)
-
架构:微服务集成
SBA Client,定期向SBA Server上报 CPU、内存、线程、日志等信息; -
作用:实时监控微服务状态,异常时自动邮件告警。
② ELK 架构(分布式日志采集)
-
组件:
-
Logstash:采集、过滤日志;
-
Elasticsearch:存储日志,支持高效查询;
-
Kibana:可视化展示日志、生成报表。
-
-
两种架构:
-
简单架构:Logstash → ES → Kibana;优点是搭建简单,缺点是 Logstash 耗资源、无缓存易丢数据。
-
增强架构:引入 Kafka/Redis 做消息队列缓存 → Logstash → ES → Kibana;避免日志丢失,更稳定。
-
程序卡死 / CPU 飙高
方案 1:原生 Linux 命令排查
-
top:查看系统 CPU 占用,找到高耗 CPU 的进程 PID; -
ps -ef | grep java:确认 Java 进程 ID; -
top -H -p:查看进程内线程的 CPU 占用; -
jstack -l:导出线程栈,找到高耗 CPU 的线程堆栈,定位代码问题。
方案 2:Arthas 工具排查(更高效)
-
启动:
java -jar arthas-boot.jar,选择目标 Java 进程; -
thread:查看所有线程状态、CPU 占比; -
定位到高 CPU 线程后,查看其堆栈,找到问题代码;
-
也可通过
jad反编译线上代码,直接分析问题。
死锁问题排查
死锁定义
多个线程互相持有对方需要的锁,导致彼此等待,程序无法继续执行。
方案 1:JDK 原生工具
-
jps:找到 Java 进程 PID; -
jstack -l:导出线程栈,日志中会直接提示Found 1 deadlock,并展示线程持有 / 等待的锁信息; -
也可使用
jconsole、jvisualvm图形化工具检测死锁。
方案 2:Arthas 工具
-
thread:查看线程状态,找到BLOCKED状态的线程; -
thread -b:直接检测并打印死锁线程信息和堆栈; -
jad:反编译问题代码,定位死锁成因(如锁获取顺序不一致)。