我負責的其中一個項目在空負載的狀況下,CPU佔用率依然保持着100%左右,線上、測試、開發的服務都同樣;是什麼致使的呢?在開發環境我查看了請求流量,這個流量能夠忽略但CPU佔用率一直在60%-100%之間浮動。java
流量能夠忽略,但CPU佔用依然極其高說明不是請求多致使的資源佔用,緣由應該是項目自己自發致使的;自發包括定時任務與死循環,而具體哪一段代碼如今也肯定不了。如今咱們就能夠藉助原生的jdk分析工具來定位是項目哪塊出現了問題(你能夠用更高級的jprofilter等,一鏈接,問題一目瞭然),如下我就採用jdk自帶工具jstack、jstat 、jmap等來逐步定位。服務器
從堆棧信息中咱們能夠看到是 WAITING致使,這個說明有一個線程長時間佔用資源,而其餘線程一直處於等待的狀態。最終定位出是在一個分佈式鎖實現的模塊中有一個保持鎖的代碼塊有問題。而後經過優化這個分佈式鎖最終解決了這個問題。經過這次優化,大大節省出了服務器資源(目前這個系統在線上是4臺集羣,至關於節省了1*4 個cpu,若是是一個上百甚至上千的集羣,那麼這個資源佔用是沒法想象的),最主要的是避免了這種狀況對系統自己的影響,避免了對正常請求的阻塞。分佈式