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
2
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等工具,定位出问题的代码位置,然后针对性分析修改。