• 當前位置:聯(lián)升科技 > 技術(shù)資訊 > 開(kāi)發(fā)技術(shù) >

    Java程序占用 CPU 過(guò)高怎么排查

    2020-11-05    作者:風(fēng)箏    來(lái)源:古時(shí)的風(fēng)箏    閱讀: 次

    這個(gè)問(wèn)題可以說(shuō)是 Java 面試的高頻面試題了,有很多面試官都喜歡問(wèn)這個(gè)問(wèn)題,問(wèn)題可能是下面這樣的。
    線(xiàn)上一臺服務(wù)器 CPU 使用率100% 了,如果你碰到這樣的情況,如何排查并找到問(wèn)題原因?
    這就是一個(gè)套路題,所謂套路題就是有標準的套路解法的,掌握了套路,不僅能解決面試官,還能解決問(wèn)題。不然真的就掉進(jìn)套路里了。
    當我們真碰到這個(gè)問(wèn)題的時(shí)候應該怎么排查呢?
    模擬一個(gè)高 CPU 場(chǎng)景
    先用一段程序創(chuàng )建幾個(gè)線(xiàn)程,將其中一個(gè)線(xiàn)程設置成高 CPU 使用率的。
    public static void main(String[] args)  { 
      for (int i = 0; i < 10; i++) { 
        Thread thread = new Thread(() -> { 
          System.out.println(Thread.currentThread().getName()); 
          try { 
            Thread.sleep(30 * 60 * 1000); 
          }catch (Exception e){ 
            e.printStackTrace(); 
          } 
        }); 
        thread.setName("thread-" + i); 
        thread.start(); 
      } 
     
      Thread highCpuThread = new Thread(() -> { 
        int i = 0; 
        while (true) { 
          i++; 
        } 
      }); 
      highCpuThread.setName("HighCpu"); 
      highCpuThread.start(); 
    運行這段程序后,前面 10 個(gè)線(xiàn)程都處于休眠狀態(tài),只有最后一個(gè)線(xiàn)程會(huì )持續的占用 CPU 。
    運行這段程序,然后就可以開(kāi)始一些列的操作來(lái)發(fā)現問(wèn)題原因了。
    排查步驟
    第一步,使用 top 找到占用 CPU 最高的 Java 進(jìn)程
    在真實(shí)環(huán)境中,首先要確認是不是 Java 程序造成的,如果有系統監控工具,可能會(huì )直接在預警信息里告訴你是有哪個(gè)進(jìn)程造成的,但也有可能不知道,需要我們手動(dòng)排查。
    如果是在面試場(chǎng)景中,這個(gè)問(wèn)題可能不需要確認,畢竟 Java 面試,面試官可能直接就告訴你是 Java 占用的 CPU 過(guò)高。
    這一步也非常簡(jiǎn)單,就是一個(gè) top命令而已,基本上所有同學(xué)都用過(guò)這個(gè)命令吧。

    使用 top命令發(fā)現占用 CPU 99.7% 的線(xiàn)程是 Java 進(jìn)程,進(jìn)程 PID 為 13731。
    第二步,用 top -Hp 命令查看占用 CPU 最高的線(xiàn)程
    上一步用 top命令找到了那個(gè) Java 進(jìn)程。那一個(gè)進(jìn)程中有那么多線(xiàn)程,不可能所有線(xiàn)程都一直占著(zhù) CPU 不放,這一步要做的就是揪出這個(gè)罪魁禍首,當然有可能不止一個(gè)。
    執行top -Hp pid命令,pid 就是前面的 Java 進(jìn)程,我這個(gè)例子中就是 13731 ,完整命令為:
    top -Hp 13731,執行之后的效果如下

    可以看到占用 CPU 最高的那個(gè)線(xiàn)程 PID 為 13756。
    然后將 13756轉換為 16 進(jìn)制的,后面會(huì )用到,可以用在線(xiàn)進(jìn)制轉換的網(wǎng)站直接轉換,轉換結果為 0x35bc
    第三步,保存線(xiàn)程棧信息
    當前 Java 程序的所有線(xiàn)程信息都可以通過(guò) jstack命令查看,我們用jstack命令將第一步找到的 Java 進(jìn)程的線(xiàn)程棧保存下來(lái)。
    jstack 13731 > thread_stack.log 
    第四步,在線(xiàn)程棧中查找最貴禍首的線(xiàn)程
    第二步已經(jīng)找到了這個(gè)罪魁禍首的線(xiàn)程 PID,并把它轉換成了 16 進(jìn)制的,第三步保存下來(lái)的線(xiàn)程棧中有所有線(xiàn)程的 PID 16 進(jìn)制信息,我們在線(xiàn)程棧中查找這個(gè)16進(jìn)制的線(xiàn)程 id (0x35bc)。

    怎么樣,現在一目了然了,線(xiàn)程名稱(chēng)、線(xiàn)程狀態(tài)、以及哪行代碼消耗了最多的 CPU 都很清楚了。
    本文轉載自微信公眾號「古時(shí)的風(fēng)箏」,可以通過(guò)以下二維碼關(guān)注。轉載本文請聯(lián)系古時(shí)的風(fēng)箏公眾號。


    相關(guān)文章

    我們很樂(lè )意傾聽(tīng)您的聲音!
    即刻與我們取得聯(lián)絡(luò )
    成為日后肩并肩合作的伙伴。

    行業(yè)資訊

    聯(lián)系我們

    13387904606

    地址:新余市仙女湖區仙女湖大道萬(wàn)商紅A2棟

    手機:13755589003
    QQ:122322500
    微信號:13755589003

    江西新余網(wǎng)站設計_小程序制作_OA系統開(kāi)發(fā)_企業(yè)ERP管理系統_app開(kāi)發(fā)-新余聯(lián)升網(wǎng)絡(luò )科技有限公司 贛ICP備19013599號-1   贛公網(wǎng)安備 36050202000267號   

    微信二維碼
    色噜噜狠狠一区二区三区果冻|欧美亚洲日本国产一区|国产精品无码在线观看|午夜视频在线观看一区|日韩少妇一区二区无码|伊人亚洲日韩欧美一区二区|国产在线码观看清码视频