前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM-8.JVM 性能监控 可视化

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

作者头像
悠扬前奏
发布2019-05-30 20:22:23
5550
发布2019-05-30 20:22:23
举报

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:动态加入调试代码
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. JConsole:Java监视与管理控制台
    • 1.1. 概述
      • 1.2 内存
        • 1.3线程监控
        • 2. VirtualVM
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档