CPU、内存利用率过高问题排查(模拟)
参考文献:
https://www.jianshu.com/p/c8e116d5b29f
https://www.jianshu.com/p/3667157d63bb
http://blog.51cto.com/wushank/1660004
http://www.javatang.com/archives/2017/10/19/51301886.html
http://www.cnblogs.com/yuyijq/p/4431798.html
重点:与自己nettysocket采坑经历完全相同
https://www.jianshu.com/p/13f72e0395c8
1. 使用top命令查看哪些进程占用CPU高
根据下图所示可以看到进程号pid为31259占用内存空间较大。
占用内存大小可以通过两个方面求得:
(1) 进程占用内存空间=RES-SHR=3.6g-10M=3.6G
(2) 进程占用内存空间=系统总内存大小*内存利用率=16G*22.8%=3.648G
系统总内存大小,使用命令free –m,可以求得约为16G
2.查看该进程下各个线程的占用情况
top –H p 31259或 ps -mp 31259 -oTHREAD,tid,time | sort -rn
从上图中可以看出31269线程占用cpu较多,且占用cpu时间较长。
3.使用命令,将线程ID31269 进行进制转换,转为16进制
printf "%x\n" 31269
4.使用命令查看线程正在做什么
jstack 31259|grep7a25 -A30 –color
网上查询VM thread是一个单例的对象(最原始的线程)会产生或触发所有其他的线程,这个单例的VM线程是会被其他线程所使用来做一些VM操作(如清扫垃圾等)。而其上下文中都是GC线程任务,初步判断GC压力比较大。
6.将线程栈输入到文本中,并统计gc线程的个数
jstack31259 >stack.txt
cat stack.txt |grep 'GC'|wc –l
7.每2s输出一次,查看GC情况
jstat -gcutil 31259 2000 10
8.查看对象占用情况:
jmap -histo 31259 >histo.txt
打开文本可以看到
与实际运行情况相符。
使用jhat分析java堆内存
1.查看进程
2.导出堆
jmap -dump:live,file=a.map 21487
可以查看堆对象的所占用的大小,实例的个数