jvisualvm.exe查看內存溢出

1、打開jvisualvm.exe

找到jdk/bin目錄 雙擊運行jvisualvm.exehtml

image.png

2、找到本身的項目

image.png

3、查看jvm內存(查看內存泄漏)

image.png

堆Dump 是堆的記錄 點擊會生成當前時間的Dump記錄java

內存泄漏代碼

模擬代碼markdown

import java.util.ArrayList;

/**
 * @description:
 * @author: jyk
 * @time: 2021/7/8 17:16
 */
public class overflow {
    static class OOMObject{
        private String con;
        public OOMObject(String con){
            this.con = con;

        }
    }

    public static void main(String[] args) {
        ArrayList<OOMObject> list = new ArrayList<>();
        int a = 0;
        while (true){
            list.add(new OOMObject("這是第:"+ a++));
        }
    }

}
複製代碼
配置idea的jvm大小與配置生成快照位置
HeapDumpOnOutOfMemoryError 這個是說明要生成快照
先運行一下main方法在配置這些方便一點
-Xms10m
-Xmx10m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\
複製代碼

image.png

生成快照

生成本地快照後\
打開快照 選擇生成的快照格式(.hprof) 引入快照
複製代碼

image.png

找到內存溢出的緣由 
這是ArrayList存儲的數據量太多致使jvm佔滿了致使的
複製代碼

image.png

image.png

查看下標裏面的東西 發現存了好多類 致使的, 找到這個方法 查看是哪裏調用了 (到這一步就能定位到問題了)
複製代碼

image.png

image.png

4、查看線程死鎖

代碼示例:jvm

/**
 * @description: 線程死鎖
 * @author: jyk
 * @time: 2021/7/12 16:43
 */
public class DeadLock {
    private  Object lock1 = new Object();
    private  StringBuffer lock2 = new StringBuffer();

    public  void method1() throws InterruptedException {
        //使用Object對象 同時鎖住Object 對象
        synchronized(lock1){
            System.out.println(Thread.currentThread().getName() + "獲取到lock1,請求獲取lock2....");
            Thread.sleep(1000);
            //使用StringBuffer對象 同時鎖住StringBuffer 對象
            synchronized (lock2){
                System.out.println("獲取到lock2....");
            }
        }
    }
    public  void method2() throws InterruptedException {
        //使用StringBuffer對象 同時鎖住StringBuffer 對象
        synchronized(lock2){
            System.out.println(Thread.currentThread().getName() + "獲取到lock2,請求獲取lock1....");
            Thread.sleep(1000);
            //使用Object對象 同時鎖住Object 對象
            synchronized (lock1){
                System.out.println("獲取到lock1....");
            }
        }
    }

    public static void main(String[] args) {
        DeadLock deadLock = new DeadLock();

        //兩個線程 互相調用 Object對象和StringBuffer對象而後產生死鎖
        new Thread(()-> {
            try {
                deadLock.method1();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(()-> {
            try {
                deadLock.method2();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

    }

}

複製代碼
右下角是顏色對應的狀態
複製代碼

image.png

點擊線程Dump 會生成線程堵塞信息

 java.lang.Thread.State 後面對應的信息
 死鎖,Deadlock(重點關注)
 執行中,Runnable
 等待資源,Waiting on condition(重點關注)
 等待獲取監視器,Waiting on monitor entry(重點關注)
 對象等待中,Object.wait() 或 TIMED_WAITING
 暫停,Suspended
 阻塞,Blocked(重點關注)
 中止,Parked
 
複製代碼

找到 Found * deadlock.ide

查看線程的waiting to lock ,等待被鎖住的對象 與locked鎖住的對象工具

image.png

參考連接:

使用jvisualvm排查一次內存溢出(OOM)過程: blog.csdn.net/xcc_2269861…oop

使用Jvisualvm監控JVM的內存、CPU、線程: blog.csdn.net/weixin_3433…this

使用jvisualvm.exe工具查看java項目內存溢出(堆溢出)--製造內存溢出:www.cnblogs.com/chongyou/p/…idea

相關文章
相關標籤/搜索