cpu占用率过高的原因:1、代码中存在死循环;2、算法过于复杂。对于算法过于复杂而导致的CPU占用率过高的问题,分析起来并不容易。下面提供一种方法,不管你对代码的逻辑以及业务的需求是否了解,只要掌握了这种方法,都可以将问题定位出来。
我们都知道,在Linux、unix下都有性能统计工具,通过top命令,我们可以看到某个进程所占用的CPU。
第一步,找到cpu到底被谁吃了,
通过 top -p pid 命令查看进程的CPU占用率,在top命令的界面输入“H”,查看该进程所有的线程的统计情况(CPU占用率等)。通过top的H命令,可以获取到如下详细信息:每个线程消耗了多少CPU(H命令下,PID列是指线程ID)。找到CPU占用率高的线程id,并记录下来。
第二步:打印线程堆栈
‘ 在Linux下,可以通过kill -3 pid命令获取线程堆栈。注意,在启动进程时,需要将进程重定向到文件中,否则线程堆栈无法打印。
第三步:根据PID找到对应线程堆栈中的线程
在Java thread dump中,每个线程都有tid=....nid=....,其中,nid就是本地线程id,对应刚才top命令输出的pid,这是在 Java thread dump 中采用16进制输出的。。将第一步中记录下来的线程id,转化为16进制。在线程堆栈文件中,找到对应的线程,通过堆栈信息就可以看到cpu占用率高的线程到底在做些什么了。。。
知道线程在做些什么之后,就很容易地位出有问题的代码啦。。到此,大功告成。