如何找到佔用CPU和內存最高的線程

title: 如何找到佔用CPU和內存最高的線程

date: 2017-03-01

tags: java


一、如何找到CPU和內存佔用最高的線程

  1. 代碼示例

    我們先來寫一段代碼

    
       @Test
       public void testLinuxTop() throws  Exception{
           boolean b=true;
           System.out.println("start the cpu Thread");
           while (b){
               int i=(int)Math.random()*1000;
               if (i%3==1){
    
               }
               if (i==1000){
                   System.out.println("stop");
                   b=false;
               }
           }
    
       }

    隨便寫了個死循環,然後怎麼看下CPU佔用情況呢?

    TOP命令

    先用ps -ef|grep tomcat查看一下你當前tomcat的進程號,比如我看出來我的進程號是8545

    然後用TOP命令查看當前所有進程

    top -p 8545
    top -p 8545 -H //這樣也可以

    使用地址中,進入了下面這個界面之後就要按H了

    於是你就會看到下面這張圖片

    這裏寫圖片描述

    CPU佔用接近滿了,內存佔用30M,怎麼會佔用這麼多?OK,我們記住PID 8545

  2. jstack命令

    OK,我們在棧裏面來找出這段代碼,可以直接用jstack把棧裏面的東西打出來

    直接使用下面的就可以

    jstack 8545 > stack.log 在你的當前目錄下面就會出現一個stack.log文件,這是包括所有的棧信息的,這裏的8545是tomcat的進程號tomcat的進程號tomcat的進程號,重要的事情強調一下

    如何找到有問題的代碼呢?

    我們剛纔拿到了一個CPU最高的進程號8545,OK,轉化爲16進制,使用下面命令

    printf "%x\n" 8545
    //或者
    printf 0x%x 8545 

    上面兩種都可以拿到16進制的8545,或者你自己去用計算器拿去,這裏我們得到的是0x2162或者2161(上面一種可以直接拿到2161,沒有0x),我們要的就是2161

    可以直接到jstack.log文件裏面去搜索,就看到出問題的代碼了

  3. 想直接看

    下面提供一種直接看的方法

    jstack 8545|grep -A 30 2162

    得到線程堆棧信息中2162這個線程所在行的後面30行

  4. question

    4.1 我使用jstack pid報錯了怎麼辦?

    使用jstack pid可能會出現8545 operation permitted之類的錯誤,解決辦法,請切換至root用戶執行命令

  5. over

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章