场景——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 的锁超时机制;
四、

浙公网安备 33010602011771号