linux java 尋找進程中的線程__linux

來源:互聯網
上載者:User
這裡對linux下、sun(oracle) JDK的線程資源佔用問題的尋找步驟做一個小結; linux環境下,當發現java進程佔用CPU資源很高,且又要想更進一步查出哪一個java線程佔用了CPU資源時,按照以下步驟進行尋找: (一):通過【 top -p12377 -H】 查看java進程的有哪些線程的運行情況;       和通過【jstack 12377 > stack.log】產生Java線程的dump詳細資料; 先用top命令找出佔用資源厲害的java進程id,如圖:# top 如上圖所示,java的進程id為’52554′,接下來用top命令單獨對這個進程中的所有線程作監視:
1 top -p52554 -H

#  top視圖裡面裡面可以通過快速鍵依次b ,x高亮顯示top的列找出需要的線程,預設CPU排序,Shift+< ,Shift+>可以左右移動高亮排序的列;

如圖:(這時就看出來哪個java線程CPU高,哪個線程記憶體用的多)
如上圖所示,linux下,所有的java內部線程,其實都對應了一個進程id,也就是說,linux上的sun jvm將java程式中的線程映射為了作業系統進程;我們看到,佔用CPU資源最高的那個進程id是’15417′,這個進程id對應java線程資訊中的’nid’(‘n’ stands for ‘native’); (1)要想找到到底是哪段具體的代碼佔用了如此多的資源,先使用jstack打出當前棧資訊到一個檔案裡, 比如stack.log: python -c"print hex(9757)"然後記住二進位的號 cat stack.log|grep 二進位的號

1

jstack 52554 > stack.log

然後使用’jtgrep’指令碼把這個進程號為’9757′的java線程在stack.log中抓出來:

1 jtgrep 9757 stack.log

其中,’jtgrep’是自己隨便寫的一個shell指令碼:

1 #!/bin/sh
3 nid=`python -c"print hex($1)"`
4 grep -i $nid $2

道理很簡單,就是 把’9757′轉換成16進位後,直接grep stack.log;可以看到,被grep出的那個線程的nid=0x3c39,正好是15417的16進位表示。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.