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:反编译问题代码,定位死锁成因(如锁获取顺序不一致)。

相关推荐
zhangchaoxies23 分钟前
如何在 Go 中安全复制接口指针所指向的值
jvm·数据库·python
m0_734949792 小时前
怎么利用Navicat进行调整备份文件压缩等级_详细配置与操作步骤
jvm·数据库·python
m0_741173332 小时前
如何处理SQL中的NULL值_使用ISNULL或COALESCE函数
jvm·数据库·python
步辞3 小时前
css伪类选择器-nth-child应用技巧_循环选择列表或表格行的实现方法
jvm·数据库·python
2301_803875614 小时前
Python怎么计算NumPy数组的切比雪夫距离_使用abs与max求解
jvm·数据库·python
qq_349317484 小时前
CSS如何实现Bootstrap进度条自定义动画_利用keyframe关键帧
jvm·数据库·python
2401_871492854 小时前
Python机器学习怎么防止数据泄漏_确保Scaler在Pipeline内拟合
jvm·数据库·python
2301_818008444 小时前
MySQL怎样在触发器中引用新旧数据行_NEW与OLD关键字详解
jvm·数据库·python
qq_372154238 小时前
如何配置表中某列的排序权重_全文索引配置与权重分配
jvm·数据库·python
2501_914245938 小时前
CSS如何使用-nth-of-type精确选择列表项_通过元素类型限制提升样式健壮性
jvm·数据库·python