场景——JVM

一、接口响应时间从100ms飙升至2s,如何排查?

只有调用时间飙升,CPU和内存使用率均正常。

可能的原因:

  • 线程池阻塞:导致请求堆积,网关触发限流
  • 外部依赖延迟:第三方接口调用超时
  • 资源竞争:死锁
  • 等等等

排查方向:

  • 检查线程的状态,比如:
    top 命令:找到最耗cpu的进程;
    top -H -p 进程id 命令:找到进程中最耗cpu的线程;
    jstack 命令:查看线程状态
  • 分析依赖服务性能:慢SQL、锁等待、缓存命中。。。
  • 检查JVM垃圾回收:通过 jstat 查询GC的频率和回收时间, 是否频繁触发 full gc
  • 网络与连接池的诊断:网络波动
  • 日志分析:数据库日志、系统日志

 

二、如何定位线上OOM?

1 原因:

  • 一次性申请的太多:更改申请对象数量
  • 内存资源耗尽未释放:找到未释放的对象进行释放
  • 本身资源不够:使用 jmap -heap 查看堆信息

2 定位:

系统已经OOM挂了:导出Dump文件

  • 提前设置,-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

系统运行中还未OOM:

  • 导出dump文件,jmap -dump:format=b,file=xushu.hprof 14660
  • Arthas

结合jvisualvm 进行调试:

  • 查看最多跟业务有关对象->找到GCRoot ->查看线程栈

 

三、如何定位、避免死锁?

原因:并发下线程因为相互等待对方资源,导致“永久”阻塞的现象;

定位:

  • jps 命令:查看正在运行的 Java 进程的进程 ID,查找死锁的进程 id;
  • jstack 命令:查看死锁的进程;

预防:

  • 不使用互斥锁;
  • A 同时锁住自己和对方的资源,避免互相竞争;
  • Lock 的锁超时机制;

 

四、

posted @ 2025-08-14 18:08  幻月hah  阅读(4)  评论(0)    收藏  举报