简单使用jdk自带的jconsole+jvisualvm

文章目录

  • 产生死锁代码
    • 运行Jconsole
    • Jconsole界面功能介绍
      • 概览
      • 内存
      • 线程
    • 检测死锁:
    • OOM分析

jconsole来检测死锁是很方便的,当然也有更多其他功能,这里做一下简单演示,后边还会继续补充!

产生死锁代码

代码:

package worktest;

/**
 * @author jeffSmile
 * @date 2020-04-28 上午 10:32
 * @desc 死锁
 */
public class DeadLock {

    private static Object resourceA = new Object();
    private static Object resourceB = new Object();

    public static void main(String[] args) {
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (resourceA){
                    System.out.println(Thread.currentThread()+"  get ResourceA");
                    try{
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread()+"  waiting ResourceB");
                    synchronized (resourceB){
                        System.out.println(Thread.currentThread()+"  get ResourceB");
                    }
                }
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (resourceB){
                    System.out.println(Thread.currentThread()+"  get ResourceB");
                    try{
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread()+"  waiting ResourceA");
                    synchronized (resourceA){
                        System.out.println(Thread.currentThread()+"  get ResourceA");
                    }
                }
            }
        });

        threadA.start();
        threadB.start();
    }
}

运行后代码就卡在这了!
简单使用jdk自带的jconsole+jvisualvm_第1张图片

运行Jconsole

接下来我们用jdk自带的jconsole来检测下死锁的状态!

  • 进入D:\Java\jdk1.8.0_201\bin
    在这里插入图片描述
  • 选择需要监控的本地进程:
    简单使用jdk自带的jconsole+jvisualvm_第2张图片

Jconsole界面功能介绍

概览

  • 概览中显示的是虚拟机主要运行数据的情况,包括“堆内存使用情况”、“线程”、”类“、“Cpu使用情况”
    简单使用jdk自带的jconsole+jvisualvm_第3张图片

内存

内存监控相当于是jstat的可视化命令,用于监控虚拟机内存(主要是java堆和永久代)的变化趋势。
简单使用jdk自带的jconsole+jvisualvm_第4张图片

线程

线程标签页相当于是jstack命令的可视化,
简单使用jdk自带的jconsole+jvisualvm_第5张图片

类标签主要查看加载的类的数量

  • 简单使用jdk自带的jconsole+jvisualvm_第6张图片

检测死锁:

简单使用jdk自带的jconsole+jvisualvm_第7张图片
简单使用jdk自带的jconsole+jvisualvm_第8张图片

可以看到thread-1和thread-0形成了死锁!

OOM分析

代码:

package worktest.jvm;

import java.util.ArrayList;
import java.util.List;

/**
 * @author jeffSmile
 * @date 2020-04-28 下午 10:54
 * @desc  -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
 */
public class HeapOOM {

    static class OOMObject{

    }

    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<>();
        while (true){
            list.add(new OOMObject());
        }
    }
}

在这里插入图片描述
简单使用jdk自带的jconsole+jvisualvm_第9张图片

简单使用jdk自带的jconsole+jvisualvm_第10张图片
可以看到异常信息OutOfMemoryError.java

简单使用jdk自带的jconsole+jvisualvm_第11张图片
98.6%实例数占据了太多了内存导致堆OutOfMemoryError

简单使用jdk自带的jconsole+jvisualvm_第12张图片

你可能感兴趣的:(#,锁机制)