项目

一般

简介

cpu飙高通用解决步骤

由 he shancai 在 大约 3 年 之前添加

cpu 飙高时:

1、执行“top”命令 ,找到占用cpu高的进程pid  

2、拿到进程高的pid,执行top -Hp pid (找到该进程中具体占用的cpu的业务线程,如果是“VM Thread”这就是虚拟机GC回收线程),例子: top -Hp 3989

3、打jstack文件 jstack pid > 1.txt (多打几个)  

4、.执行 printf "%x\n" pid 命令,线程号转成16进制(用于查询jstack 堆栈信息中的具体业务线程)

例子:printf "%x\n"  4004      输出:fa4

拿到对应的16进制pid ,这里是fa4

在文件jstack 1.txt 文件中搜索对应的线程信息

或者命令直接查询(jstack 进程号 | grep 线程ID)

5、如果cpu占用高的多为C2 Compiler(并不是业务线程),可以通过 阿里的Arthas 工具进行分析

C2 Compiler:

C2 Compiler 是JVM在server模式下字节码编译器,JVM启动的时候所有代码都处于解释执行模式,当某些代码被执行到一定阈值次数,
这些代码(称为热点代码)就会被 C2 Compiler编译成机器码,编译成机器码后执行效率会得到大幅提升。

流量进来后,大部分代码成为热点代码,这个过程中C2 Compiler需要频繁占用CPU来运行,
当大部分热点代码被编译成机器代码后,C2 Compiler就不再长期占用CPU了,这个过程也可以看作抖动。

 

 

解决:

查到具体的业务线程,进行优化

如果是gc导致cpu飙高:

1、如果是GC回收线占用高,打jstat -gc pid 1000 ,查看某进程GC持续变化情况,

例子:fullgc,1-3秒触发一次,内存溢出,fullgc 会导致Stop-the-World,导致系统卡顿,假死

2、执行“jmap -dump:live,format=b,file=/usr/local/heap.hprof pid “  dump文件,导出某进程下内存heap输出到文件中。可以通过eclipse的mat工具查看内存中有哪些对象比较多。

例子:

解决:

拿到具体的占jvm内存较大的对象信息,从而进行优化