<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java中的CPU占用高和內(nèi)存占用高的問題排查

          共 4181字,需瀏覽 9分鐘

           ·

          2021-03-03 11:01

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

            作者 |  歸去來兮辭

          來源 |  urlify.cn/MBjaAz

          76套java從入門到精通實(shí)戰(zhàn)課程分享

          下面通過模擬實(shí)例分析排查Java應(yīng)用程序CPU和內(nèi)存占用過高的過程。如果是Java面試,這2個(gè)問題在面試過程中出現(xiàn)的概率很高,所以我打算在這里好好總結(jié)一下。

          1、Java CPU過高的問題排查

          舉個(gè)例子,如下: 

          package com.classloading;
          public class Test {
              static class MyThread extends Thread {
                  public void run() { // 死循環(huán),消耗CPU
                      int i = 0;
                      while (true) {
                          i++;
                      }
                  }
              }
              public static void main(String args[]) throws InterruptedException {
                  new MyThread().start();
                  Thread.sleep(10000000);
              }
          }

          使用top命令查看占用CPU過高的進(jìn)程。如下圖所示。

            

          查看進(jìn)程6102下線程的占用情況,如下圖所示。

           

          使用如下命令將6122轉(zhuǎn)換為16進(jìn)制表示,如下:

           

          導(dǎo)出CPU占用高進(jìn)程的線程棧。命令如下:


          jstack pid >> java.txt 
           
          Attaching to remote server pid, please wait...
          2021-02-23 15:38:18
          Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.192-b12 mixed mode):
           
          "Attach Listener" #10 daemon prio=9 os_prio=0 tid=0x00007f4ee0001000 nid=0x1956 runnable [0x0000000000000000]
             java.lang.Thread.State: RUNNABLE
          // 這是0x17ea線程,也是占用CPU最高的線程
          "Thread-0" #9 prio=5 os_prio=0 tid=0x00007f4f180d6000 nid=0x17ea runnable [0x00007f4f044da000]
             java.lang.Thread.State: RUNNABLE
              at com.cpuhigh.Test$MyThread.run(Test.java:8)  // 這里指示第8行,則正是死循環(huán)的代碼開始
           
          ...

          內(nèi)容如下:  

          導(dǎo)出的堆棧信息有線程的狀態(tài)(一般要找RUNNABLE狀態(tài))和調(diào)用堆棧結(jié)合來查找問題。線程dump分析:線程dump分析主要目的是定位線程長(zhǎng)時(shí)間停頓的原因 

          2、Java 內(nèi)存過高的問題排查 

          舉個(gè)例子如下:

          package com.classloading;
           
          import java.util.ArrayList;
          import java.util.List;
           
          public class Test {
              private static final int UNIT_MB = 1024 * 1024;
               
              public static void main(String args[]) throws InterruptedException{
                  List<Object> x = new ArrayList<Object>();
                  int i = 0;
                  while(i<1000){
                      x.add(new byte[UNIT_MB]);
                      i++;
                  }
                  Thread.sleep(1000000000);
              }
          }

          通過jmap dump內(nèi)存快照。如果是線上環(huán)境,注意dump之前必須先將流量切走,否則大內(nèi)存dump是直接卡死服務(wù)。

          命令行輸入:


          jmap -histo <pid> | head -20


           就可以查看某個(gè)pid的java服務(wù)占用內(nèi)存排名前20的類,如下圖所示。

          可以看到,占用內(nèi)存最多的是byte字節(jié)數(shù)組,共有1008個(gè)實(shí)例。

          jmap還有一個(gè)指令可以把整個(gè)內(nèi)存情況轉(zhuǎn)成文件形式保存下來,如下:

          jmap -dump:format=b,file=filename.bin <pid>

           執(zhí)行命令如下圖所示。

          可以在JVM啟動(dòng)時(shí)設(shè)置,如果發(fā)生OOM,則dump出文件。命令如下:

          -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof
          jmap -dump:format=b,file=filename.bin <pid>

          如果快照文件不大,可以下載到本地,然后通過MAT分析,也可以在線分析(https://fastthread.io/);如果快照文件很大,可以在服務(wù)器上直接分析,使用的命令是:

          jhat dump.hprof

          jhat也是jdk內(nèi)置的工具之一。主要是用來分析java堆的命令,可以將堆中的對(duì)象以html的形式顯示出來,包括對(duì)象的數(shù)量,大小等等,并支持對(duì)象查詢語(yǔ)言。命令執(zhí)行后如下圖所示。

           

          訪問如下圖所示。

          其中的Show heap histogram就會(huì)顯示對(duì)象占用內(nèi)在的大小。如下圖所示。 

           

           

           


          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ??????

          ??長(zhǎng)按上方微信二維碼 2 秒


          感謝點(diǎn)贊支持下哈 

          瀏覽 43
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本中文无码视频 | 色电影网址 | 欧美大香蕉欧美 | 十八禁成人黄网站 | 韩国精品在线观看 |