1. 程式人生 > >linux java 查詢程序中的執行緒

linux java 查詢程序中的執行緒

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

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

    如圖:(這時就看出來哪個java執行緒CPU高,哪個執行緒記憶體用的多)

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