线上 CPU 飚高问题你们应该都遇到过,那么如何定位问题呢?服务器
思路:首先找到 CPU 飚高的那个 Java 进程,由于你的服务器会有多个 JVM 进程。而后找到那个进程中的 “问题线程”,最后根据线程堆栈信息找到问题代码。最后对代码进行排查。app
如何操做呢?工具
经过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。优化
再次经过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.ui
经过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。具体命令:jstack -l [进程 ID] >jstack.log。spa
因为刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,所以咱们须要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。使用 printf "%x\n" [十进制数字] ,能够将10进制转换成16进制。线程
经过刚刚转换的16进制数字从堆栈信息里找到对应的线程堆栈。就能够从该堆栈中看出端倪。3d
从楼主的经验来看,通常是某个业务死循环没有出口,这种状况能够根据业务进行修复。还有 C2 编译器执行编译时也会抢占 CPU,什么是 C2编译器呢?当 Java 某一段代码执行次数超过10000次(默认)后,就会将该段代码从解释执行改成编译执行,也就是编译成机器码以提升速度。而这个 C2编译器就是作这个的。如何解决呢?项目上线后,能够先经过压测工具进行预热,这样,等用户真正访问的时候,C2编译器就不会干扰应用程序了。若是是 GC 线程致使的,那么极有多是 Full GC ,那么就要进行 GC 的优化。进程