前言
在研发过程中,经常会出现部署的项目在运行一段时间后,突然出现cpu占用过高的问题,这会造成服务响应时间增长,严重则会出现宕机的情况
分析
- 首先用top命令查看进程的cpu占用情况
2. 找到java程序的pid,在用top -H -p pid命令查看该进程下所有线程占用cpu情况
top -H -p 5085
复制代码
3. 找到cpu占用最高的线程,pid就是这个线程的id,也可以用ps -mp pid -o THREAD,tid,time命令效果类似
4. 将线程id转为16进制,再用jstack pid | grep 线程id 就可以查看该线程的堆栈信息了
复制代码
然后就可以跟堆栈信息去分该线程为什么占用很高,上图是两种情况,如果是图一的话,我们可以根据上面显示的类名以及代码行数去分析代码确定线程占用cpu过高的原因,如果是图二的话,代表占用cpu最高的是gc线程,那么就需要继续分析下去
5. 使用jstat 命令查看gc日志
jstat -gc pid 3000
3000代表每3秒打印一次
复制代码
S0C:S0区容量(S1区相同,略)
S0U:S0区已使用
EC:E区容量
EU:E区已使用
OC:老年代容量
OU:老年代已使用
PC:Perm容量
PU:Perm区已使用
YGC:Young GC(Minor GC)次数
YGCT:Young GC总耗时
FGC:Full GC次数Xmx512m [file]
FGCT:Full GC总耗时
GCT:GC总耗时
复制代码
如果发现FGC次数和频率很高,那么不用怀疑,你的程序肯定哪里写的有问题。这个时候就需要用jstack和jmap去分析堆内存使用情况
6. 用jmap -dump:format=b,file=heapdump.phrof pid命令去生成dump文件然后用专用软件如jprofiler
当然这个软件也可以在开发中使用,可以很直观的通过界面看到程序运行过程中堆栈,线程,等各种信息,方便快速定位问题。
选择正在运行的你的程序即可
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END