CPU占用高及内存占用高问题分析
1.cpu超高分析
1、找到要分析的进程
ps -ef|grep XXX
2、查看具体进程里的信息 top -H -p 22423
3、打印进程的堆栈信息 jstack -l 22423 >> 6.txt
4、把2步骤里占用cpu最高的线程 转为16进制 printf "%x\n" 31218 ,然后根据16进制在堆栈日志里查找堆栈。
或则直接:
printf "%x\n" 5858
16e2
jstack 5753|grep 16e2 -A 30
2、内存泄漏分析
(1)打开jvisualVM,打进入要分析的java进程的监视选项卡,点击 堆dump,生成C:\Users\wangna\AppData\Local\Temp\visualvm.dat\localhost_31996\heapdump-1590374952368.hprof文件。
(2)使用MemoryAnalyzer.exe (D:\tools\MemoryAnalyzer-1.10.0.20200225-win32.win32.x86_64\mat),双击打开
file -> open file 打开heapdump-1590374952368.hprof文件。进入 Leak Suspects,分析给出的Problem Suspect 点击进入Details,分析代码,查看各个类对象的个数。
(3)还可以点击 System Overview,查看系统使用内存情况以及各个线程使用内存情况和大对象的使用情况。
在linux 上根据进程号导出.hprof文件
jmap -dump:format=b,file=flink.hprof 31622
在linux上查看各个类的实例数和内存占用大小:
jmap -histo 6902
jmap -histo:live 6902 > xxx.log
3、查看GC
jstat -gcutil 6902 2000 10 (6902为进程号,可以观察该进程的GC情况)
4、系统cpu、内存和io使用不高,但cpu等待队列较多负载较大的问题分析
1、查看系统的等待队列 内存 cpu 和io等整体资源消耗命令
vmstat 1
2、查看各个进程的每秒上下文切换情况
pidstat -w 1
3、找到切换频繁的进程后,查看该进程的上下文切换数
grep ctxt /proc/进程号/status
grep ctxt /proc/5743/status
voluntary_ctxt_switches: 4821 #自愿的上下文切换
nonvoluntary_ctxt_switches: 1 #非自愿的上下文切换
引起上下文切换的原因:
对于抢占式操作系统而言, 大体有几种:
当前任务的时间片用完之后,系统CPU正常调度下一个任务;
当前任务碰到IO阻塞,调度线程将挂起此任务,继续下一个任务;
多个任务抢占锁资源,当前任务没有抢到,被调度器挂起,继续下一个任务;
用户代码挂起当前任务,让出CPU时间;
硬件中断;
cswch/s: 每秒任务主动(自愿的)切换上下文的次数,当某一任务处于阻塞等待时,将主动让出自己的CPU资源。
nvcswch/s: 每秒任务被动(不自愿的)切换上下文的次数,CPU分配给某一任务的时间片已经用完,因此将强迫该进程让出CPU的执行权。
context switch过高会导致CPU像个搬运工,频繁在寄存器和运行队列之间奔波 ,更多的时间花在了线程切换,而不是真正工作的线程上。直接的消耗包括CPU寄存器需要保存和加载,系统调度器的代码需要执行。间接消耗在于多核cache之间的共享数据。