最近线上经常出现CPU比较高的情况,这里记录下如何定位问题。
先使用top命令查看那个进程占的CPU较高,这里可以看到,pid为:6381的Java进程占用了262%的CPU,之所以是262%是因为机器是4核的,400%是满CPU。
知道pid后就可以使用ps -mp pid -o THREAD,tid,time命令显示进程下的线程列表。如下图所示:
这里可以看到有4个线程长时间占用较高的CPU,我们拿到一个tid,转为16进制:
最后使用jstack命令打印线程的堆栈信息,命令为:jstack pid |grep tid -C 30
这里可以看到是由于GC导致的CPU占用较高,那么我们使用jstat -gcutil pid 1000 20命令来打印Java进程的GC情况,如下图所示:
这里可以看到FGC的次数和时间不是很正常,为什么会导致频繁的FGC呢?
在程序中,如果有未关闭的资源,导致GC回收不了,一直占用着内存,就会导致频繁的FGC。而在我这里是由于httpclient未关闭导致一直占用内存,从而导致GC。所以在平时写代码的过程中,一定要记得及时的关闭资源。