【Debug】如果一个应用卡死了,如何去排查卡死的原因?

1、首先查询是不是前端和网络的问题,查看网络通信状态是不是正常

2、如果网络没有问题就去使用Linux的top命令查看CPU和内存的使用情况,如果CPU和内存占用飙升则可能是出现了死锁的情况。还要使用iostat命令来查看系统的IO情况,如果IO频繁就说明MySQL的SQL语句优化不够好,造成了大量对硬盘的写入读取操作。

3、如果有死锁现象,则需要定位死锁位置,先使用jinfo来查看所有的Java进程和进程ID,再使用jstack查看相应的进程运行状态,里面有各个进程的状态,其中就有Blocking阻塞状态,来查看是不是死锁,里面会写上在代码中的相应位置。

4、如果没有出现死锁的问题,我们再查看MySQL是不是出现问题,查看MySQL的错误日志以及慢查询日志,看看有没有特殊的报错信息跟大量的慢查询sql语句,然后用explain进行分析是不是大量sql没有索引,引起全表扫描,造成系统卡顿。

5、进入数据库,用show processlist查看正在执行的语句,看看有没有特殊的信息。比如出现大量的锁表语句,我这边就是查到数据库出现大量的锁表语句出现,说大量的写跟读都是再同一张表上一边没进行完另一边还在请求等待就造成死锁。查看MySQL的是指就可以确定是不是数据库出现了死锁现象

6、如果CPU占用没有很高,则使用Jmap -dump 命令导出JVM快照信息,将快叫导入GC easy中,可以显示GC情况,停顿时间大小,来判断是不是因为GC太频繁导致系统卡死。在日志中也会有内存地址的指向,可以用来定位具体是因为哪个对象而导致频繁GC,可以定位一些大对象,或者判断是因为年轻态太小,或者老年代太小等原因导致频繁GC

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章