今天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。
本文介绍了一次在测试环境中发现的Java进程CPU占用率异常升高的案例。通过使用top命令定位到具体进程,并借助jstack工具分析线程堆栈,最终发现是因为一个死循环导致的CPU空转问题。文章还提供了修复建议。

被折叠的 条评论
为什么被折叠?



