最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM實戰(zhàn)系列之CPU100%和內(nèi)存100%排查

 更新時間:2023年06月05日 09:31:12   作者:互聯(lián)網(wǎng)小趴菜  
本文主要介紹了JVM實戰(zhàn)系列之CPU100%和內(nèi)存100%排查,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1. 基礎概念

  • 內(nèi)存溢出(Memory Overflow)指的是程序在申請內(nèi)存時,向操作系統(tǒng)申請了一塊內(nèi)存空間,但由于某種原因(如程序錯誤、缺乏足夠的內(nèi)存等),導致程序使用的內(nèi)存超過了申請到的內(nèi)存大小。這會導致程序崩潰或者出現(xiàn)未定義的行為。
  • 內(nèi)存泄漏(Memory Leak)指的是程序在動態(tài)分配內(nèi)存后,沒有及時釋放已經(jīng)不需要的內(nèi)存空間,導致系統(tǒng)中存在大量無用的內(nèi)存占用,最終可能會導致系統(tǒng)的性能下降或者耗盡可用內(nèi)存資源。

可以這樣理解:內(nèi)存溢出是指程序需要的內(nèi)存超過了可用內(nèi)存;而內(nèi)存泄漏則是指程序本身的內(nèi)存管理不當,使用了系統(tǒng)提供的內(nèi)存卻沒有及時釋放。

2. 內(nèi)存100%案例

堆內(nèi)存溢出代碼示例:

private static List<byte[]> CACHE = new ArrayList<>(1000);
@GetMapping("/tuningTest")
public String tuningTest(){
    for (int loopTimes = 1; loopTimes < 20; loopTimes++) {
        long cacheSize = ObjectSizeCalculator.getObjectSize(CACHE);
        LOGGER.info("第 {} 次循環(huán)前, 對象已占用 {} M 內(nèi)存", loopTimes, cacheSize / 1024 / 1024);
        // 每次占用5M內(nèi)存
        CACHE.add(new byte[5 * 1024 * 1024]);
    }
    return "OK";
}

啟動參數(shù):java -jar -Xms32m -Xmx64m -XX:PermSize=15M -XX:MaxPermSize=30M jvmtest-0.0.1-SNAPSHOT.jar

測試時為了效果明顯可以用壓測工具,并發(fā)數(shù)20,輪次1000。更有助于分析問題

2.1 top 命令查看cpu和內(nèi)存情況

2.2 jmap -heap PID查看jvm內(nèi)存使用情況

從圖中可以看出老年區(qū)的內(nèi)存使用率已經(jīng)達到了96%

2.3 jstat -gc PID 查看GC的情況

  • YGC : YG GC的次數(shù)
  • YGCT:YG GC的平均時間
  • FGC: FULL GC的次數(shù)
  • FGCT:FULL GC的平均時間

這里可以連續(xù)看幾次就會發(fā)現(xiàn)FULL GC的次數(shù)在瘋狂增長,而且FULL GC的平均時間也會增長,這就是CPU100%的原因,因為CPU一直在嘗試垃圾回收

2.4 jmap -dump:format=b,file=./jmap_dump.hprof PID 使用jmap命令生成分析所需要用的dump文件。

使用Jprofiler打開(為什么不用mat,因為我沒安裝上,不知道為啥)

如上圖已經(jīng)定位出來了問題,這個工具還是很好用的,有興趣的大佬們可以研究研究

3. CPU100%案例

代碼示例

/**
 * 死循環(huán)
 *
 * @return
 */
@RequestMapping("/deadCycle")
public String deadCycle() {
    for (int i = 1; i > 0; i++) {
        System.out.println(i);
    }
    return "Success";
}
/**
 * 死鎖
 *
 * @return
 */
@RequestMapping("/deadLock")
public String deadLock() {
    Lock lock1 = new ReentrantLock();
    //線程t1中
    new Thread(() -> {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        while (!lock1.tryLock()) {
            System.out.println("線程1 一直自旋獲取鎖");
        }
        System.out.println("線程1 獲取到鎖 do something");
    }).start();
    // 線程2
    new Thread(() -> {
        lock1.lock();  //此時線程2 獲取到鎖 但是一直阻塞 導致鎖無法釋放
        while (true) {
        }
    }).start();
    return "Success";
}

這里就整一個最簡單里例子,目的就是為了讓CPU一直在運算。

3.1 top 命令查看CPU占用100%的進程號

3.2 top -H -n 1 -p PID 然后通過命令查找對應進程下線程的狀態(tài)

3.3 然后通過 jstack -l PID > ./jstack.log 命令輸出進程的線程文件

jstack.log的文件PID是十六機制,從3.2步驟中我們可以看出PID為25778的線程CPU特別高,25778二機制為0x64b2。拿到16進制去文件里搜索能夠很明確看出哪里出現(xiàn)了問題

到此這篇關于JVM實戰(zhàn)系列之CPU100%和內(nèi)存100%排查的文章就介紹到這了,更多相關JVM CPU100%和內(nèi)存100%排查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java獲取當前時間戳案例詳解

    Java獲取當前時間戳案例詳解

    這篇文章主要介紹了Java獲取當前時間戳案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java Arraylist在多線程環(huán)境下的問題與解決方案

    Java Arraylist在多線程環(huán)境下的問題與解決方案

    這篇文章主要介紹了關于arraylist的多線程問題以及多種場景下的解決方案,同時詳細簡述了其核心內(nèi)容和原理,希望對大家有一定的幫助
    2026-03-03
  • Java中清空集合列表元素的四種方法

    Java中清空集合列表元素的四種方法

    Java清空列表有多種方式,包括clear()高效直接、創(chuàng)建新列表需注意引用、removeAll需傳入集合、循環(huán)移除效率低,下面就來介紹一下如何實現(xiàn),感興趣的可以了解一下
    2025-07-07
  • Spring Boot集成Spring Cache過程詳解

    Spring Boot集成Spring Cache過程詳解

    這篇文章主要介紹了Spring Boot集成Spring Cache過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Spring Cache手動清理Redis緩存

    Spring Cache手動清理Redis緩存

    這篇文章主要介紹了Spring Cache手動清理Redis緩存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • java創(chuàng)建以任意圖片為背景的窗口

    java創(chuàng)建以任意圖片為背景的窗口

    這篇文章主要為大家詳細介紹了java創(chuàng)建以任意圖片為背景的窗口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Springboot使用redisson實現(xiàn)分布式鎖的代碼示例

    Springboot使用redisson實現(xiàn)分布式鎖的代碼示例

    在實際項目中,某些場景下可能需要使用到分布式鎖功能,那么實現(xiàn)分布式鎖有多種方式,常見的如mysql分布式鎖、zookeeper分布式鎖、redis分布式鎖,本文介紹springboot如何使用redisson實現(xiàn)分布式鎖,需要的朋友可以參考下
    2023-06-06
  • Java?Api實現(xiàn)Elasticsearch的滾動查詢功能

    Java?Api實現(xiàn)Elasticsearch的滾動查詢功能

    這篇文章主要介紹了Java?Api實現(xiàn)Elasticsearch的滾動查詢,解決ES每次只能查詢一萬條數(shù)據(jù)的問題,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • java實現(xiàn)圖片轉(zhuǎn)ascii字符畫的方法示例

    java實現(xiàn)圖片轉(zhuǎn)ascii字符畫的方法示例

    這篇文章主要介紹了java實現(xiàn)圖片轉(zhuǎn)ascii字符畫的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Java時間轉(zhuǎn)換成unix時間戳的方法

    Java時間轉(zhuǎn)換成unix時間戳的方法

    這篇文章主要為大家詳細介紹了Java時間轉(zhuǎn)換成unix時間戳的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論

邵东县| 军事| 洛宁县| 临澧县| 蒙城县| 石景山区| 略阳县| 宽城| 额敏县| 邵阳市| 冀州市| 高邑县| 巴彦淖尔市| 蒲江县| 雅江县| 康保县| 马尔康县| 彭山县| 郁南县| 青冈县| 天等县| 阿鲁科尔沁旗| 冀州市| 共和县| 界首市| 新干县| 资中县| 新邵县| 苏尼特右旗| 如东县| 内乡县| 澄迈县| 城步| 都兰县| 枣庄市| 万全县| 冕宁县| 阿图什市| 商都县| 大城县| 邓州市|