java进程cpu占用高排查
java进程cpu占用高排查
java进程cpu占用高如何排查_停5s的博客-CSDN博客
步骤
java线程视角
1.ps aux 查看进程PID
1 | ps aux |
2.使用top -H -p [java进程id],找到cpu占用较高的线程id
1 | top -H -p pid |
3.计算java线程id的16进制值,因为后续用jstack看到的线程快照中,线程id为小写十六进制值
1 | printf "%x" 1227 |
4.使用命令 jstack [java进程pid] | grep [线程id十六进制值] -A 30
1 | jstack pid | grep threadId -A 30 |
GC视角
1.使用top命令查看内存利用率
2.确认gc次数,使用命令 jstat -gc [java进程ID]
1 | jstat -gc pid |
YGC,表示 Young GC,也就是Minor GC,发生在新生代中的GC
FGC,表示 Full GC,发生在老年代中的GC
S0C:第一个幸存区的大小S1C:第二个幸存区的大小S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小EC:伊甸园区的大小EU:伊甸园区的使用大小OC:老年代大小OU:老年代使用大小MC:方法区大小MU:方法区使用大小CCSC:压缩类空间大小CCSU:压缩类空间使用大小YGCT:年轻代垃圾回收消耗时间FGCT:老年代垃圾回收消耗时间GCT:垃圾回收消耗总时间
如何计算gc频率,参考:https://blog.csdn.net/qq_18671415/article/details/104446568
3.使用命令dump 内存堆存储快照:jmap -dump:format=b,file=/tmp/my.hprof [java进程id]
1 | jmap -dump:format=b,file=/tmp/my.hprof [java进程id] |
4.使用内存分析工具,如Eclipse Memory Analyzer等分析my.hprof文件,分析内存那块占用大,存在内存泄露,导致空间无法释放。
总结
cpu利用率过高排查,需要从两个角度排查,一是自身任务线程是否存在bug,二是是否内存泄露导致触发频繁gc;然后利用top、jstack、jmap等工具,定位出问题的代码位置,然后针对性分析修改。