今天review了一下测试环境,后来发现一个java进程CPU 120%多,4核的CPU,很多人都没感觉。但是确实是很大问题。测试环境没什么并发,也没什么数据量怎么会这么高的cpu呢?
找到java进程中耗cpu最高的nid,
top –p pid –H
用jstack或者其他方式打印一下线程堆栈,从堆栈记录里找出nid,对应的线程和他的堆栈。找到出问题的方法。有这么一段代码。
while (true) {
while (blockingDeque.size() > 0) {
try {
final String message = String.valueOf(blockingDeque.poll());
}
}
本来blockingqueue的目的是空的时候,让线程堵住。让出CPU资源。现在他完全没用到,改成了让CPU空转,使得CPU 100%。另外需要将poll改成take或者加上timeout。代码还是要经常去review。