找到jdk/bin目錄 雙擊運行jvisualvm.exejava
右擊打開markdown
堆Dump 是堆的記錄 點擊會生成當前時間的Dump記錄jvm
內存泄露代碼 能夠本身試試ide
配置idea的jvm大小與配置生成快照位置
HeapDumpOnOutOfMemoryError 這個是說明要生成快照
先運行一下main方法在配置這些方便一點
-Xms10m
-Xmx10m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\
複製代碼
生成本地快照後\
打開快照 選擇生成的快照格式(.hprof) 引入快照
複製代碼
找到內存溢出的緣由 這個是ArrayList存儲的數據量太多致使jvm佔滿了致使的
複製代碼
查看ArrayList 裏面的內容
複製代碼
查看下標裏面的東西 發現存了好多類 致使的, 找到這個方法 查看是哪裏調用了 (到這一步就能定位到問題了)
複製代碼
上面那一步就能夠定位到問題了 ,下面是查看佔比
複製代碼
線程死鎖代碼oop
* @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();
}
}
複製代碼
這個是可視化的
下圖片中的右下角是顏色對應的信息
複製代碼
點擊線程Dump 會生成線程堵塞信息idea
java.lang.Thread.State 後面對應的信息
死鎖,Deadlock(重點關注)
執行中,Runnable
等待資源,Waiting on condition(重點關注)
等待獲取監視器,Waiting on monitor entry(重點關注)
對象等待中,Object.wait() 或 TIMED_WAITING
暫停,Suspended
阻塞,Blocked(重點關注)
中止,Parked
複製代碼
找到 Found * deadlock.;查看線程的waiting to lock ,等待被鎖住的對象與locked鎖住的對象spa