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高

根据下图所示可以看到进程号pid31259占用内存空间较大

CPU、内存利用率过高问题排查(模拟)

占用内存大小可以通过两个方面求得:

(1)   进程占用内存空间=RES-SHR=3.6g-10M=3.6G

(2)   进程占用内存空间=系统总内存大小*内存利用率=16G*22.8%=3.648G

系统总内存大小,使用命令free –m,可以求得约为16G

CPU、内存利用率过高问题排查(模拟)

2.查看该进程下各个线程的占用情况

top –H p 31259或 ps -mp 31259 -oTHREAD,tid,time | sort -rn


从上图中可以看出31269线程占用cpu较多,且占用cpu时间较长。

3.使用命令,将线程ID31269 进行进制转换,转为16进制

printf "%x\n" 31269

CPU、内存利用率过高问题排查(模拟)

4.使用命令查看线程正在做什么

jstack 31259|grep7a25 -A30 –color

CPU、内存利用率过高问题排查(模拟)

网上查询VM thread是一个单例的对象(最原始的线程)会产生或触发所有其他的线程,这个单例的VM线程是会被其他线程所使用来做一些VM操作(如清扫垃圾等)。而其上下文中都是GC线程任务,初步判断GC压力比较大。

6.将线程栈输入到文本中,并统计gc线程的个数

   jstack31259 >stack.txt

cat stack.txt |grep 'GC'|wc –l

CPU、内存利用率过高问题排查(模拟)

7.每2s输出一次,查看GC情况

jstat -gcutil 31259 2000 10

CPU、内存利用率过高问题排查(模拟)

8.查看对象占用情况:

jmap -histo 31259 >histo.txt

打开文本可以看到

CPU、内存利用率过高问题排查(模拟)

与实际运行情况相符。

使用jhat分析java堆内存

1.查看进程

CPU、内存利用率过高问题排查(模拟)

2.导出堆

jmap -dump:live,file=a.map 21487

CPU、内存利用率过高问题排查(模拟)

可以查看堆对象的占用的大小,实例的个数

CPU、内存利用率过高问题排查(模拟)

CPU、内存利用率过高问题排查(模拟)