java基础教程虚拟机性能分析和故障解决工具【可视化】

java基础教程虚拟机性能分析和故障解决工具【图形化界面】

--------------作用:帮助判断cpu占用率过高、死循环、死锁、内存泄露、内存溢出等等问题。

 

JConsole:重点学查看线程、内存

VisualVM (推荐):跟JConsole 功能一样,但是功能比JConsole强大。【详细介绍】

 

 

1、jconsole------重点学查看线程、内存

 

2、VisualVM-----运行监视、故障处理、性能分析

■ VisualVM基于NetBeans平台开发,因此他一开始就具备了插件扩展功能的特性,通过插件扩展支持,VisualVM可以做到:
    - 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
    - 监视应用程序的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)。
    - dump以及分析堆转储快照(jmap、jhat)。
    - 方法级的程序运行性能分析,找到被调用最多、运行时间最长的方法。
    - 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈。
    - 其他plugins的无限的可能性…

■ 使用与安装插件
    1.在终端输入:jvisualvm执行即可;
    2.安装插件:
​       2.1 从主菜单中选择“工具”>“插件” ;
​       2.2 在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装” ;
      ​ 2.3 逐步完成插件安装程序。

✿ 测试类的代码:

package jvisualvm;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * JVisualVM 内存分析
 * @author Huangyujun
 *
 */
public class jvisualvmDemo1 {
    public static void main(String[] args) throws IOException, InterruptedException {
        test1();
        System.in.read();
    }

    private static void test1() throws InterruptedException {
        List<Student> list = new ArrayList<>();
        for(int i = 0; i < 100; i++) {
            Thread.sleep(1000);
            list.add(new Student());
        }
    }
}

class Student {
    private byte[] big = new byte[5 * 1024 * 1024];    //5M
}

■ 使用jvisualvm 具体步骤:

1):先在eclipse终端上输入:jvisualvm

2):选中咱的测试类双击:

■ 看到的工具栏这些选项,其实就对应的是jvisualvm中安装的插件,需要更多功能,就安装一下啦

 

■  堆Dump 和 线程Dump重点

1): 堆Dump:在监视中有堆Dump 【点完观察最左边应用程序生成了一个堆Dump 文件; 当然这时候点概述也可以看到堆Dump 数量,点击它也可以查看堆Dump文件信息】

 

 2): 线程Dump:在线程选项里有线程Dump

 

还有抽样器对CPU和内存进行一段时长的取样,从而对应用程序进行分析 【通过 快照或者暂停,获取到某个时刻的内存或cpu状态】

 

 

3,补充jvisualvm的使用---检查死锁:

1):代码案例:

private static void dealLock() {
        Lock lock1 = new ReentrantLock();
        Lock lock2 = new ReentrantLock();
        new Thread(() -> {            
            try {
                lock1.lock();//在线程myThread1中:lock1锁完不释放去睡觉了,在线程myThread2中:lock1 想再锁没机会呀
                Thread.sleep(100);
                lock2.lock();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
        }, "myThread1").start(); 
        new Thread(() -> {            
            try {
                lock2.lock();
                Thread.sleep(100);
                lock1.lock();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
        }, "myThread2").start(); 
    }

 

2):jvisualvm工具中的情况:

 

posted @ 2021-12-04 11:06  一乐乐  阅读(76)  评论(0编辑  收藏  举报