zoukankan      html  css  js  c++  java
  • JDK可视化工具

    JConsole Java监视与管理控制台

    启动JConsole

      通过jdk/bin/下的“jconsole.exe”来启动,启动后将搜索出本机运行的所有虚拟机进程,不需要再使用 jps 来查询。双击进程即可开始监控。

      

      

      

       概览页显示的是虚拟机运行时的情况,包括“堆内存使用量”、“线程”、“类”、“CPU使用情况”。

    内存监控

      “内存”页签相当于可视化的 jstat 命令,用于监视受收集器管理的虚拟机内存(Java堆和永久代)的变化趋势。  

    package com.wjz.demo;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class OOMObject {
        // 内存占用,每一个OOMObject对象大约占用64K
        public byte[] placeholder = new byte[64 * 1024];
        public static void fillHeap(int num) throws InterruptedException {
            List<OOMObject> list = new ArrayList<OOMObject>();
            for (int i = 0; i < num; i++) {
                // 稍作延迟让内存变化曲线更加明显
                Thread.sleep(50);
                list.add(new OOMObject());
            }
            System.gc();
        }
        /**
         * -Xms100M -Xmx100M -XX:+UseSerialGC
         */
        public static void main(String[] args) throws InterruptedException {
            Thread.sleep(5000);
            fillHeap(800);
        }
    }

      

    线程监控

      “线程”页签相当于可视化 jstack 命令。用来监视分析线程停顿的原因。 

    package com.wjz.demo;
    
    public class ThreadMonitoring {
        // 线程死循环
        public static void busyThread() {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    while (true){
                        
                    }
                }
            }, "busyThread");
            thread.start();
        }
        // 线程锁等待
        public static void lockThread(final Object lock) {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    synchronized (lock) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            // 
                        }
                    }
                }
            }, "lockThread");
            thread.start();
        }
        public static void main(String[] args) throws Exception {
            busyThread();
            Object lock = new Object();
            lockThread(lock);
        }
    }

      busyThread线程一直执行空循环,从堆栈跟踪上看到一直停留在ThreadMonitoring.java的8行(while (true) {})处。此时线程为Runnable状态且没有归还线程执行令牌的动作,会在空循环上用尽全部执行时间直到线程切换,消耗较多的CPU资源。

      

      lockThread线程等待着lock对象notify或notifyAll方法出现,此线程处于Waiting状态,在被唤醒前不会被分配执行时间。

      

       监控线程是否发生死锁

    package com.wjz.demo;
    
    public class DeadLock implements Runnable {
        int a, b;
        public DeadLock (int a, int b) {
            this.a = a;
            this.b = b;
        }
        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 < 100; i++) {
                new Thread(new DeadLock(1, 2)).start();
                new Thread(new DeadLock(2, 1)).start();
            }
        }
    }

      

    VisualVM 运行监视、故障处理、性能分析工具

      VisualVM通过安装插件来扩展功能,除了命令工具和JConsole工具具备的功能还能进行方法级的程序运行性能分析,找出调用最多执行时间最长的方法等。  

      插件下载地址:https://visualvm.github.io/pluginscenters.html

      

  • 相关阅读:
    REST-framework快速构建API--生成Swagger接口文档
    Django后端彻底解决跨域问题
    Zabbix实战-简易教程--DB类--ClickHouse
    Django权限控制进阶
    django自定义rbac权限组件(二级菜单)
    jQuery事件委托
    model中的Meta类
    django中ModelForm解决多表单组合显示问题
    Django请求的生命周期
    AJAX
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/7639970.html
Copyright © 2011-2022 走看看