linux下采用ps、jstack命令排查命中java應用中佔用CPU高的代碼

  一般情況下,是因爲系統出現瓶頸了,纔會去進行調優,而調優則要先找出項目代碼中的問題,這次針對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的


    這樣命中是哪個方法正在被當前的線程使用。

發佈了52 篇原創文章 · 獲贊 15 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章