`
ldd600
  • 浏览: 101600 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
47bb354f-8b5f-3ea6-a206-c7ead38c741c
Hyperic插件开发不完...
浏览量:11066
社区版块
存档分类
最新评论

Java进程CPU100%的问题

阅读更多

今天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。

0
0
分享到:
评论
1 楼 406657836 2013-05-26  
java 在server模式下对while进行了优化。把判断提前了。在client模式下看不出,所以开发的时候也最好是server模式。
不过这个优化有点坑,因为size()方法本身是采用了同步的,只是没有用synchronize。

相关推荐

Global site tag (gtag.js) - Google Analytics