JVM——线上问题定位

目录

线上问题定位

通用排查思路

[接口报错 / 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:可视化展示日志、生成报表。

  • 两种架构:

    1. 简单架构:Logstash → ES → Kibana;优点是搭建简单,缺点是 Logstash 耗资源、无缓存易丢数据。

    2. 增强架构:引入 Kafka/Redis 做消息队列缓存 → Logstash → ES → Kibana;避免日志丢失,更稳定。

程序卡死 / CPU 飙高

方案 1:原生 Linux 命令排查

  1. top:查看系统 CPU 占用,找到高耗 CPU 的进程 PID;

  2. ps -ef | grep java:确认 Java 进程 ID;

  3. top -H -p:查看进程内线程的 CPU 占用;

  4. jstack -l:导出线程栈,找到高耗 CPU 的线程堆栈,定位代码问题。

方案 2:Arthas 工具排查(更高效)

  1. 启动:java -jar arthas-boot.jar,选择目标 Java 进程;

  2. thread:查看所有线程状态、CPU 占比;

  3. 定位到高 CPU 线程后,查看其堆栈,找到问题代码;

  4. 也可通过 jad 反编译线上代码,直接分析问题。

死锁问题排查

死锁定义

多个线程互相持有对方需要的锁,导致彼此等待,程序无法继续执行。

方案 1:JDK 原生工具

  • jps:找到 Java 进程 PID;

  • jstack -l:导出线程栈,日志中会直接提示 Found 1 deadlock,并展示线程持有 / 等待的锁信息;

  • 也可使用 jconsolejvisualvm 图形化工具检测死锁。

方案 2:Arthas 工具

  1. thread:查看线程状态,找到 BLOCKED 状态的线程;

  2. thread -b:直接检测并打印死锁线程信息和堆栈;

  3. jad:反编译问题代码,定位死锁成因(如锁获取顺序不一致)。

相关推荐
Mr. zhihao11 小时前
死锁排查实战:JVM 唯一会“自动报案“的问题(场景 B5)
java·jvm·gc
Mr. zhihao15 小时前
OOM 排查实战(大结局):从老年代爬坡到 VisualVM 引用链实锤(场景 B4)
jvm·gc·oom·mat·visulvm
H_老邪16 小时前
JVM 遇到的问题-1.0
jvm
liangbo720 小时前
JVM规范第 4 章:class 文件格式
java·jvm
夕除21 小时前
redis--008
java·jvm·数据库
liangbo721 小时前
JVM规范第 1章:从一段历史到「JVM 并不认识 Java」
java·jvm
月华路1 天前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
月华路2 天前
G1 新生代对象晋升老年代:实现机制与 GC 日志
java·jvm·算法
Shadow(⊙o⊙)2 天前
C++进阶知识5.0
jvm
一木 之林2 天前
五、C++新特性、关键字与编译原理
java·jvm·算法