如果遇到线上服务器系统运行突然缓慢并有大量报警的现象时,那么可能系统的CPU过高或者FULL GC 次数过多,我们可以通过以下方法进行排查和解决问题。
排查思路:
如果因为系统突然运行缓慢导致服务不可用的时候,我们首先要做的是导出 jstack 和内存信息,然后重启系统,尽快恢复服务。这种情况的原因主要有两种:
代码中某个位置读取数据量较大,导致系统内存耗尽从而 FULL GC 次数过多,系统缓慢;
代码中有比较耗 CPU 的操作,导致CPU 过高,系统运行缓慢;
还有几种情况会导致某个功能运行缓慢,但是不至于导致系统不可用:
代码某个位置有阻塞性的操作,导致该功能调用整体比较耗时,但出现是比较随机的;
某个线程由于某种原因而进入WAITING状态,此时该功能整体不可用,但是无法复现;
由于锁使用不当,导致多个线程进入死锁状态,从而导致系统整体比较缓慢;
对于这三种情况,通过查看CPU和系统内存情况是无法查看出具体问题的,因为它们相对来说都是具有一定阻塞性操作,CPU和系统内存使用情况都不高,但是功能却很慢。
解决思路:
1.FULL GC次数过多
这种情况主要有两个特征:
- 多个线程 CPU 非常高,并且通过 jstack 命令可以看到这些线程主要是垃圾回收线程;
- 通过 jstat 命令监控 GC 情况,可以看到FULL GC 次数非常多,并且可能还在不断增加;