一臺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(); } } }很明顯了吧,不過我第一眼居然沒看出來,哈哈。在這裏記錄了下,免的本身也犯這樣的錯誤 。