日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java中的CPU占用高和內(nèi)存占用高的問題排查

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

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出婁煩免費做網(wǎng)站回饋大家。

1、Java CPU過高的問題排查

舉個例子,如下:

 
 
 
 
  1. package com.classloading;  
  2. public class Test {  
  3.     static class MyThread extends Thread {  
  4.         public void run() { // 死循環(huán),消耗CPU  
  5.             int i = 0;  
  6.             while (true) {  
  7.                 i++;  
  8.             }  
  9.         }  
  10.     }  
  11.     public static void main(String args[]) throws InterruptedException {  
  12.         new MyThread().start();  
  13.         Thread.sleep(10000000);  
  14.     }  

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

查看進程6102下線程的占用情況,如下圖所示。

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

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

 
 
 
 
  1. jstack pid >> java.txt 

內(nèi)容如下:

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

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

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

舉個例子如下:

 
 
 
 
  1. package com.classloading;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. public class Test {  
  5.     private static final int UNIT_MB = 1024 * 1024;  
  6.      public static void main(String args[]) throws InterruptedException{  
  7.         List x = new ArrayList();  
  8.         int i = 0;  
  9.         while(i<1000){  
  10.             x.add(new byte[UNIT_MB]);  
  11.             i++;  
  12.         }  
  13.         Thread.sleep(1000000000);  
  14.     }  
  15. 通過jmap dump內(nèi)存快照。 如果是線上環(huán)境,注意dump之前必須先將流量切走,否則大內(nèi)存dump是直接卡死服務(wù)。

    命令行輸入:

     
     
     
     
    1. jmap -histo  | head -20 

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

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

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

     
     
     
     
    1. jmap -dump:format=b,file=filename.bin  

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

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

     
     
     
     
    1. -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof 

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

     
     
     
     
    1. jhat dump.hprof 

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

    訪問如下圖所示。

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


    文章標題:Java中的CPU占用高和內(nèi)存占用高的問題排查
    標題路徑:http://www.5511xx.com/article/dpjspog.html