<sup id="qjuuc"></sup>
  • <td id="qjuuc"><rp id="qjuuc"><center id="qjuuc"></center></rp></td>
    • <menuitem id="qjuuc"></menuitem>
      • <menuitem id="qjuuc"><tfoot id="qjuuc"><em id="qjuuc"></em></tfoot></menuitem>
      • <menuitem id="qjuuc"></menuitem>
        <strike id="qjuuc"><rp id="qjuuc"></rp></strike>
        • <fieldset id="qjuuc"></fieldset>
            <tt id="qjuuc"><tfoot id="qjuuc"></tfoot></tt>
          • 當(dāng)前位置:聯(lián)升科技 > 技術(shù)資訊 > 開發(fā)技術(shù) >

            Java程序占用 CPU 過高怎么排查

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

            這個(gè)問題可以說是 Java 面試的高頻面試題了,有很多面試官都喜歡問這個(gè)問題,問題可能是下面這樣的。
            線上一臺(tái)服務(wù)器 CPU 使用率100% 了,如果你碰到這樣的情況,如何排查并找到問題原因?
            這就是一個(gè)套路題,所謂套路題就是有標(biāo)準(zhǔn)的套路解法的,掌握了套路,不僅能解決面試官,還能解決問題。不然真的就掉進(jìn)套路里了。
            當(dāng)我們真碰到這個(gè)問題的時(shí)候應(yīng)該怎么排查呢?
            模擬一個(gè)高 CPU 場(chǎng)景
            先用一段程序創(chuàng)建幾個(gè)線程,將其中一個(gè)線程設(shè)置成高 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(); 
            運(yùn)行這段程序后,前面 10 個(gè)線程都處于休眠狀態(tài),只有最后一個(gè)線程會(huì)持續(xù)的占用 CPU 。
            運(yùn)行這段程序,然后就可以開始一些列的操作來(lái)發(fā)現(xiàn)問題原因了。
            排查步驟
            第一步,使用 top 找到占用 CPU 最高的 Java 進(jìn)程
            在真實(shí)環(huán)境中,首先要確認(rèn)是不是 Java 程序造成的,如果有系統(tǒng)監(jiān)控工具,可能會(huì)直接在預(yù)警信息里告訴你是有哪個(gè)進(jìn)程造成的,但也有可能不知道,需要我們手動(dòng)排查。
            如果是在面試場(chǎng)景中,這個(gè)問題可能不需要確認(rèn),畢竟 Java 面試,面試官可能直接就告訴你是 Java 占用的 CPU 過高。
            這一步也非常簡(jiǎn)單,就是一個(gè) top命令而已,基本上所有同學(xué)都用過這個(gè)命令吧。

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

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

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


            相關(guān)文章

            我們很樂意傾聽您的聲音!
            即刻與我們?nèi)〉寐?lián)絡(luò)
            成為日后肩并肩合作的伙伴。

            行業(yè)資訊

            聯(lián)系我們

            13387904606

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

            手機(jī):13755589003
            QQ:122322500
            微信號(hào):13755589003

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

            微信二維碼
            五月天婷婷在线观看历史|国产欧美日韩免费一区二区|亚洲成a∨人片在无码|欧美日韩不卡一区二区三区中文字|每日更新国产精品视频|成年人在线观看视频免费|亚洲A片一区二区三区在线观看
            <sup id="qjuuc"></sup>
          • <td id="qjuuc"><rp id="qjuuc"><center id="qjuuc"></center></rp></td>
            • <menuitem id="qjuuc"></menuitem>
              • <menuitem id="qjuuc"><tfoot id="qjuuc"><em id="qjuuc"></em></tfoot></menuitem>
              • <menuitem id="qjuuc"></menuitem>
                <strike id="qjuuc"><rp id="qjuuc"></rp></strike>
                • <fieldset id="qjuuc"></fieldset>
                    <tt id="qjuuc"><tfoot id="qjuuc"></tfoot></tt>