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

      

  • 相关阅读:
    hdoj 3376,2686 Matrix Again 【最小费用最大流】
    Trustie站点代码托管使用指南
    POJ 2442 Sequence(堆的使用练习)
    猛犸机器学习开发实践
    关于《金字塔原理》的主要内容
    实战案例:如何快速打造1000万+播放量的抖音网红?
    【限时特惠】网易云易盾验证码全线95折!智能无感知、滑动拼图、点选验证-7天免费体验!
    当GDPR来敲门,中国互联网企业该如何应对?
    H5活动产品设计指南基础版
    Box(视图组件)如何在多个页面不同视觉规范下的复用
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/7639970.html
Copyright © 2011-2022 走看看