定位CPU高问题

一、使用top和jstack

1.找到CPU最高的进程

命令:top
 

2.查看最高进程的线程信息,找到CPU占用最高的线程

命令:top -Hp 进程ID
 
VIRT 表示 Virtual Memory 虚拟内存
RES 表示 Resident Memory 驻留内存
SHR 表示 shared memory 共享内存

3.转换线程ID为16进制

printf %x 线程ID
 

4.dump线程堆栈

jstack 进程ID >1.txt
 

5.查看dump文件的线程相关信息

cat 1.txt |grep -A 30 16进制线程ID
 
简单查看:
jstack 进程ID | grep -A 30 16进制线程ID

二、使用JMC

JMC->MBean服务器->线程子页面->cpu概要分析
优点:简单
缺点:需要服务器开始jmx
 

三、可能导致CPU高的场景

1.无限while循环

尽量避免无限循环
让循环执行得慢一点,比如加sleep
 

2.频繁GC

降低GC频率
 

3.频繁创建新对象

合理使用单例
 

4.序列化和反序列化(有些性能差的古老的类库)

 

5.正则表达式(发生回溯时)

减少回溯发生
 

6.线程上下文频繁切换

 

四、紧急处理原则

问题发生后,第一时间是快速保留问题现场供后面排查定位,然后尽快恢复服务。保留现场的具体操作:
打印堆栈信息,命令行:jstat -l ‘java进程PID’

打印 jstack  39888 >jstack.dump
打印内存镜像,命令行:jmap -dump:format=b,file=hprof ‘java进程PID’
生成core文件,命令行:gcore ‘java进程PID’
保留gc日志文件
保留业务日志文件
查看JAVA堆内存运行分配:命令行:jstat -gcutil ‘java进程PID’ 1000
完成以上操作后,尽快重启JAVA进程或回滚,恢复服务。

posted @ 2021-03-20 19:49  windge  阅读(92)  评论(0)    收藏  举报