一、打开jvisualvm.exe
找到jdk/bin目录 双击运行jvisualvm.exe
二、找到自己的项目
三、查看jvm内存(查看内存泄漏)
堆Dump 是堆的记录 点击会生成当前时间的Dump记录
内存泄漏代码
模拟代码
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:\
生成快照
生成本地快照后\
打开快照 选择生成的快照格式(.hprof) 引入快照
找到内存溢出的原因
这是ArrayList存储的数据量太多导致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();
}
}
右下角是颜色对应的状态
点击线程Dump 会生成线程堵塞信息
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锁住的对象
参考链接:
使用jvisualvm排查一次内存溢出(OOM)过程: blog.csdn.net/xcc_2269861…
使用Jvisualvm监控JVM的内存、CPU、线程: blog.csdn.net/weixin_3433…
使用jvisualvm.exe工具查看java项目内存溢出(堆溢出)--制造内存溢出:www.cnblogs.com/chongyou/p/…