CPU飙升
1,查找飙升进程:28207
top
2,查找飙升线程:
ps -mp 28207 -o THREAD,tid,time | sort -rn > mp.txt
3,线程号转16进制
printf "%x\n" 28210
6e32
printf "%x\n" 28211
6e33
4,打印异常堆栈信息
#jstack pid |grep tid -A 30
jstack 28207 |grep 6e32 -A 30
发现是gc线程在占用cpu。
5,查看gc情况:
#jstat -gcutil pid 3000
jstat -gcutil 28207 3000
发现ygc和fgc都比较频繁。
查看堆栈去分配数量
jstat -gccapacity 28207 3000
6,导出内存进行分析
从上面分析可以看出,CPU飙升,都是GC线程在频繁执行。而且每次FGC执行都释放不了多少内存,怀疑有内存泄露。需要dump出内存分配信息,供分析。
jmap -dump:format=b,file=heapdump.phrof 28207
#压缩
tar -zcvf heapdump.tar.gz heapdump.phrof
7,下载dump文件,并使用本地MAT工具进行分析
下面是阿里出的工具,原理就是上面的步骤
安装方法:https://github.com/oldratlee/useful-scripts/blob/master/docs/install.md
使用方法:https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads