专栏首页悠扬前奏的博客JVM-8.JVM 性能监控 可视化

JVM-8.JVM 性能监控 可视化

JDK提供的可视化工具主要有JConsole和VirtualVM。

1. JConsole:Java监视与管理控制台

JConsole(Java Monitoring and Management Console)是一个基于JMX(Java Management Extensions,即Java管理扩展)的可视化监视、管理工具。 管理部分是针对JMX MBean进行管理。

1.1. 概述

界面如下,可以看到包括概述,内存,线程,类,VM概要和MBean:

概述包括整个虚拟机主要运行数据的概览,包括“堆内存使用情况”,“线程”,“类”,“CPU使用情况”。

1.2 内存

内存页相当于jstat,用于监视收集器管理的虚拟机内存(Java堆和永久代)变化趋势。 以如下代码为例:

/**
 *-Xms100m -Xmx100m -XX:+UseSerialGC
 */
public class JConsoleTest {
    static class OOMObject {
        public byte[] placeholder = new byte[64 * 1024];
    }

    public static void fillHeap(int num) throws InterruptedException {
        List<OOMObject> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            Thread.sleep(50);
            list.add(new OOMObject());
        }
        System.gc();
    }

    public static void main(String[] args) throws Exception {
        fillHeap(1000);
    }
}

可以观察到JConsole监控到的情况为:

  1. 堆内存总使用量匀速上升
  1. Eden取呈现折线状:
  • Eden区空间为27328KB
  • 未设置-XX:SurvivorRadio参数,默认为8:1,所以新生代空间为27328KB*125% = 34160K

1.3线程监控

相当于jstack命令,线程停顿可以用这个标签页进行监控分析。 以如下代码为例:

    private static void fillHeap(int num) throws InterruptedException {
        List<OOMObject> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            Thread.sleep(50);
            list.add(new OOMObject());
        }
        System.gc();
    }

    public static void createBusyThread() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    ;
                }
            }
        }, "testBusyThread");
        thread.start();
    }

    public static void creatLockThread(final Object lock) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, "testLockThread");
        thread.start();
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.readLine();
        createBusyThread();
        br.readLine();
        Object obj = new Object();
        creatLockThread(obj);
    }
  1. main线程等待System.in的输入,线程为Runnable的状态

RUNNABLE 的main线程

  1. testBusyThread一直在while(true)一行停留,也是Runnable状态:

Runnable的testBusyThread 3.testLockThread线程等待lock对象的notify或者notifyAll方法。处于WAITING状态:

waiting的testLockThread.png

  1. 死锁例子:
    static class SycnAddRunnable implements Runnable {
        int a, b;

        public SycnAddRunnable(int a, int b) {
            this.a = a;
            this.b = b;
        }

        @Override
        public void run() {
                synchronized (Integer.valueOf(a)) {
                    synchronized (Integer.valueOf(b)) {
                        System.out.println(a + b);
                    }

            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            new Thread(new SycnAddRunnable(1, 2)).start();
            new Thread(new SycnAddRunnable(2, 1)).start();
        }
    }

检测到死锁

2. VirtualVM

强大的运行监视和故障处理程序。

  • 显示虚拟机进程和进程的配置,环境信息
  • 监视应用程序的CPU,GC,堆,方法区和线程信息
  • dump以及分析heapdump文件
  • 方法级的程序运行性能分析
  • 离线程序快照:收集程序的运行时配置,线程dump,内存dump等信息建立的快照
  • 可添加plugin: 推荐:
    • BTrace:动态加入调试代码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java并行-6.线程优先级

    悠扬前奏
  • JAVA并行-1.Java线程操作

    也可以用Runnable接口新建线程,它只有一个run()方法,而且默认的Thread.run()就是调用内部的Runnable接口,因此使用Runnable更...

    悠扬前奏
  • Guava-1.17类Objects

    帮助类,用来处理各种Object。 当前版本(24.1)只有以下方法,文档中的其他方法位于MoreObjects中。附在后面。

    悠扬前奏
  • junit5中Assertions替代了Assert

    最近基于Spring Boot2.x版本中的JUnit5进行单元测试,发现Assert类已经不存在了,在JUnit5中使用Assertions进行替代。而且Ju...

    用户1161110
  • 什么是委托?

    关键字 delegate 返回值类型 委托名字([数据类型 变量],[数据类型 变量],...);

    静心物语313
  • 小文件数过多导致distcp迁移报错

    DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列...

    袁宋
  • 怎样让1+1=3?

    如下所示的是一个.NET程序。我们在这段程序中定义了一个作整数加法运算的Add方法,但是我希望将针对这个方法的调用转移到另一个Add2方法上,为此我定义了一个O...

    蒋金楠
  • 几张大数据思维导图

    用户3578099
  • Java单例模式-懒汉式、恶汉式、静态内部类、枚举以及线程安全问题

    通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数额控制并节约系统资源。

    爱学习的孙小白
  • 设计模式 - 单例(件)模式

    子乾:可拉倒吧,你这智商是不是在治伤的过程中给致伤了。要是这样,她们宁愿当易烊千玺第 1001个 老婆,都不愿意做你老婆。

    子乾建建-Jeff

扫码关注云+社区

领取腾讯云代金券