一般情況下,是因爲系統出現瓶頸了,纔會去進行調優,而調優則要先找出項目代碼中的問題,這次針對java應用佔用CPU高的代碼進行排查。
假設,目前有一個應用在運行過程中會導致CPU居高不下,而無法知道是哪段代碼引起的,這個時候,則可以採用本篇文章說的PS命令和jstack命令進行排查命中相關的代碼,對於linux下大名鼎鼎的ps命令就不介紹了,我們直接切入主題,在本篇中,我們需要獲得對應的java進程的id並且找出cpu佔用比較高的java應用線程(這裏說線程,其實在linux中線程的存在是以輕量級進程來實現的,而java的線程則是底層直接用系統線程實現的)。
ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu //打印用戶、進程id、父進程id、線程id(對於此次很重要)、運行時間、CPU使用率、啓動命令並按CPU使用率排序
從上面的圖,我們找到id爲9002的內線程id是10507的java程序用的CPU是31.7%,我們要找出這個線程正在運行哪段代碼,我們只需要通過jstack進行打印java線程棧然後查找對應的線程堆棧信息即可進行命中對應的方法。需要注意的內容是pid展示的thread _id是十進制的,而jstack展示的內容則是16進制的,所以我們需要進行轉換再查找。比如10507轉換的16進制結果290b。
運行jstack 9002 > stack.log(這裏是進程id)將堆棧內容打印重定向到stack.log中,方便慢慢查看。
使用vim stack.log進行查看,並且搜索290b,可以找到nid=0x290b的
這樣命中是哪個方法正在被當前的線程使用。