最近線上經常出現CPU比較高的情況,這里記錄下如何定位問題。
先使用top命令查看那個進程占的CPU較高,這里可以看到,pid為:6381的Java進程占用了262%的CPU,之所以是262%是因為機器是4核的,400%是滿CPU。
image
知道pid后就可以使用ps -mp pid -o THREAD,tid,time命令顯示進程下的線程列表。如下圖所示:
image
這里可以看到有4個線程長時間占用較高的CPU,我們拿到一個tid,轉為16進制:
image
最后使用jstack命令打印線程的堆棧信息,命令為:jstack pid |grep tid -C 30
image
這里可以看到是由于GC導致的CPU占用較高,那么我們使用jstat -gcutil pid 1000 20命令來打印Java進程的GC情況,如下圖所示:
image
這里可以看到FGC的次數和時間不是很正常,為什么會導致頻繁的FGC呢?
在程序中,如果有未關閉的資源,導致GC回收不了,一直占用著內存,就會導致頻繁的FGC。而在我這里是由于httpclient未關閉導致一直占用內存,從而導致GC。所以在平時寫代碼的過程中,一定要記得及時的關閉資源。