之前在做项目的过程中,项目完成后在linux服务器上做性能测试,当服务跑起来的时候发现cpu使用率很奇怪,java应用把单个cpu跑满了,其他cpu利用率0%。
刚开始遇到这问题的时候我第一时间反应使用java 自带的jconsole工具去分析,具体远程jconsole工具使用参考我另外一篇博客,分析结果后只发现创建了很多的es client对象,其他完全看不出任何异常。
我就把该部分代码给屏蔽掉,再启动服务的发现问题还是存在,那说明不是es 的client对象把cpu消耗了。
于是我又想到使用java的jvisualvm 工具,并且对代码进行死循环和死锁检测,也没有发现问题。
最后我使用了jstack工具分析出了当前正在使用cpu的线程,jstack的使用参考,上面有详细说明步骤及说明。
最后分析结果:
查看结果,可以发现是 ContentManager类的init方法一致在执行,最后找到该代码,
发现该代码中有一个while(true)代码,该代码本来的用意是用来做一个消费者代码解耦用的,现在看来这样的写法导致一个死循环,无法退出,所以造成cpu单核利用率达到100%。
到这里,造成cpu单核利用率100%的原因就算找到了,剩下的就是优化这段代码了。
结论:
经过请教公司的老员工和自己分析得到的结论就是代码中如果出现死循环,就会造成单核CPU利用高的一个原因。
所以以后在使用while(true)这样代码的时候得留意造成死循环。