CPU异常通常有如下几个原因:
- 业务逻辑问题(死循环)
- 频繁GC
- 上下文切换较多
其中, 业务逻辑问题可以使用jstack
来分析对应的堆栈情况。
一、使用jstack来分析cpu问题的步骤
1. 使用top命令,查看CPU占用较高的服务进程
通过top命令,最前面一列是对应的进程pid
2. 使用top -H -p pid
找到进程中占用cpu较高的线程
3. 将占用最高的pid转换为16进制的nid
printf '%x\n' pid
4. 在jstack中找到堆栈信息
jstack pid | grep 'nid' -C5 -color
此时必然可以看到对应的nid的堆栈信息。剩下的只要仔细分析即可。
分析的时候,需要重点关注WAITTING
和TIMED_WAITING
的部分,BLOCKED
就不用说了。
可以使用命令cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c
来对jstack状态做一个整体的把握,如果WAITING
之类的特别多,多半是有问题的。
二、使用jstat分析GC情况
jstat -gc pid 1000
该命令可以实现对GC分代情况进行观察,1000表示采样间隔(ms),S0C/S1C、S0U/S1U、EC/EU、OC/OU、MC/MU分别表示两个Survivor区,Eden区、老年代、元数据区的容量和使用量。
YGC/YGT、FGC/FGCT、GCT 则代表YoungGC、FullGC的耗时和次数,以及总耗时。
如果看到gc比较频繁,再针对gc方面做进一步分析。
三、 使用vmstat分析上下文切换
针对频繁的上下文切换问题,我们可以使用vmstat命令来进行查看。
其中,cs(context switch)一列则代表上下文切换的次数。
扩展
如果要对特定的pid进行监控,可以使用pidstat -w pid
命令,cswch和nvcswch表示自愿以及非自愿切换。