jvisualvm.exe 查看jvm堆栈内存 线程堵塞

2,156 阅读2分钟

jvisualvm.exe 查看jvm堆栈内存

一、打开jvisualvm

找到jdk/bin目录 双击运行jvisualvm.exe

image.png

二、找到自己的项目

右击打开

image.png

三、查看jvm堆内存

image.png 堆Dump 是堆的记录 点击会生成当前时间的Dump记录

查看内存泄露

内存泄露代码 可以自己试试

image.png

 配置idea的jvm大小与配置生成快照位置
 HeapDumpOnOutOfMemoryError 这个是说明要生成快照
 先运行一下main方法在配置这些方便一点
-Xms10m
-Xmx10m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\

image.png

生成本地快照后\
打开快照 选择生成的快照格式(.hprof) 引入快照

image.png

 找到内存溢出的原因 这个是ArrayList存储的数据量太多导致jvm占满了导致的

image.png

    查看ArrayList 里面的内容

image.png

 查看下标里面的东西 发现存了好多类 导致的, 找到这个方法 查看是哪里调用了 (到这一步就能定位到问题了)

image.png

上面那一步就可以定位到问题了 ,下面是查看占比

image.png

四、查看线程死锁

线程死锁代码

 * @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.;查看线程的waiting to lock ,等待被锁住的对象与locked锁住的对象

image.png