一台server的load报警,一看居然跑到18了,top了下立马查出是咱们一个应用把cpu全吃了,不过看IO基本上很正常,访问量也是毫无压力,初步判断程序有bug,不二话,查bug吧。 java
top里定位到了进程ID,web应用光pid是不够的,查了下pid下哪些线程吃了cpu: web
ps -mp [pid] -o THREAD,tid上面的pid正是应用的进程号,好家伙,大约有那么几十个线程,他们的user time基本差很少,而sys time基本为0。这么多线程,莫非要一个个查
首先固然是jstack信息了,倒出来后,再逐个把进程号换算成16进制(小写),这样就能够再grep到了。好在看了几个线程stack后,都指向了同一段代码,看来不用每一个线程都查了,果断看代码。很快,bug浮现了,某同窗的示意代码以下: 多线程
List list1 = getList1(); List list2 = getList2(); Iterator it = list1.iterator(); while(it.hasNext()){ for (Object object : list2) { if(object.toString().contains(it.next().toString())){ it.remove(); } } }很明显了吧,不过我第一眼居然没看出来,哈哈。在这里记录了下,免的本身也犯这样的错误