定位CPU高问题
一、使用top和jstack
1.找到CPU最高的进程
命令:top
2.查看最高进程的线程信息,找到CPU占用最高的线程
命令:top -Hp 进程ID
VIRT 表示 Virtual Memory 虚拟内存
RES 表示 Resident Memory 驻留内存
SHR 表示 shared 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进程或回滚,恢复服务。

浙公网安备 33010602011771号