上篇博客我们介绍了虚拟机监控和分析命令行工具,由于其不够直观,不是很容易排查问题,那么本篇博客我们就来介绍几个可视化工具。

1、JConsole

  JConsole(Java Monitoring and Management Console)是一款基于 JMX 的可视化监视和管理的工具。它管理部分的功能是针对 JMX MBean 进行管理,MBean 可以使用代码、中间件服务器的管理控制台或者所有符合 JMX 规范的软件进行访问。

  JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架,一套标准的代理和服务;MBean就是一种规范的JavaBean,通过集成和实现一套标准的Bean接口。

①、启动 JConsole

  这是我们JDK自带的监控工具,在JDK的安装目录bin下即可找到。

  如果配置过JDK环境变量,在CMD命令提示符中输入 jconsole 也可直接打开。

  

  这是一个可执行文件,直接双击即可打开。打开如下:

  

②、监控界面介绍

  JConsole 这个监控工具可以监控本地进程以及远程进程,我们这里以监控本地进程为例,来介绍具体的监控界面。

  点击本地进程下面的任意一栏,进入到监控界面。

  1、监控概览

  

  这个界面是我们建立本地连接后,进入的第一个页面。显示的是整个虚拟机主要运行数据的概览,包括“堆使用情况”、“线程”、“类”、“CPU占用率”等四项信息的曲线图,这些曲线图是后面“内存”、“线程”、“类”页签的信息汇总,下面会分别介绍这几个页签。

  2、内存监控

  这个页签相当于上一篇博客介绍的jstat命令,不过这里是可视化的。用于监视虚拟机内存的一些变化趋势。

  监视区域如下:

  

  3、线程监控

  这个页签相当于上篇博客介绍的可视化的jstat 命令。遇到线程停顿的时候可以使用这个页签进行监控分析。

  

  另外,此页面左下角还有一个检测死锁的按钮,出现线程死锁后,点击此按钮,便会出现一个新的死锁页签。

  比如,对于如下这段死锁代码:

     @GetMapping("/test2")
public void test2() throws Exception{
Object lock1 = new Object();
Object lock2 = new Object(); new Thread(()->{
synchronized (lock1){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2){
System.out.println("线程1结束运行");
}
}
}).start(); new Thread(()->{
synchronized (lock2){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1){
System.out.println("线程2结束运行");
}
}
}).start();
}

  这里创建了两把锁,lock1,lock2,创建了两个线程,线程1获取到lock1后,说你给我lock2,我就释放lock1;而线程2获取到lock2后,说你给我lock1,我就释放lock2。两个线程谁也不释放,于是便造成了死锁现象。

  通过监控工具便可以检测到,如下:

  

  4、类监控

  

  5、VM概要

  展示一些JVM信息。

  

③、配置Tomcat远程监控

  其实使用监控工具,我们很少对本地的程序进行监控,大多数情况都是对部署在远程Linux服务器上的程序进行监控,那么想要使用 JConsole这款工具进行远程监控,我们必须要进行一些配置。我们首先介绍对Tomcat的远程监控。

  1、配置catalina.sh

  在该文件下加入如下配置信息:

JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.146.200 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

  -Dcom.sun.management.jmxremote 表示开启远程连接。

  -Dcom.sun.management.jmxremote.port=9004 表示设置远程连接端口为1099

  -Dcom.sun.management.jmxremote.authenticate=false 表示不需要密码验证

  -Dcom.sun.management.jmxremote.ssl=fals 表示不需要开启ssl连接

  -Djava.net.preferIPv4Stack=true 表示只支持IPV4地址

  -Djava.rmi.server.hostname=192.168.146.200 表示监控的主机名为192.168.146.200

  添加位置如下:

  

  2、建立连接

  通过上面的配置,启动Tomcat后,我们只需要在 JConsole 的远程连接界面,输入 192.168.146.200:9004 ,然后点击连接即可。

  

  3、连接错误情况

  如果无法连接,需要依次检测如下信息:

  ①、配置的端口不能被占用,可以通过 netstat -tunlp|grep 1099 命令验证。

  ②、防火墙开启对上面设置端口的信任

  ③、通过 hostname -i 命令,如果打印的不是前面设置的ip地址,则需要通过 vim /etc/hosts 命令,将127.0.0.1 修改为本机IP地址。

④、配置远程jar包监控

  启动jar包的命令如下:

nohup java -Djava.rmi.server.hostname=192.168.146.200 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1089 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar jvm-0.0.1-SNAPSHOT.jar &

  配置端口,ip地址,和远程监控Tomcat大体上是一样的,然后建立连接即可。

2、JVisualVM

  英文介绍为 All-in-One Java Troubleshooting Tool。听名字我们就知道这是一块功能很全,很强大的Java运行监视和故障处理工具,并且是官方主力发展的虚拟机故障处理工具,其性能分析比很多专业收费软件都不会逊色多少。

①、启动 JVisualVM

  和前面介绍的JConsole工具一样,这也是 JDK 自带的一个工具,在安装目录bin下,可以直接双击启动。

  

  打开界面如下:

  

②、监控界面介绍

  其实大体界面和JConsole差不多。

  

  抽样器可以对CPU,内存进行详细监控统计。

  

③、插件机制

  JVisualVM 比较强大的地方在与可以安装各种插件,提供各种不同的功能。

  点击上方菜单栏 工具---》插件:

  

  然后设置插件中心的地址:

  

  这个地址,我们可以到这个网址上去获取:

  https://visualvm.github.io/pluginscenters.html

  选择对应的插件地址时,要根据我们的JDK版本来选定。

  比如,我这边的JDK版本如下:

  

  那么选择的地址如下(152,介于131-221之间):

  

  设置好下载地址后,我们这边选择需要的插件,点击安装即可!比如比较常用的插件 Visual GC(用来查看GC日志)

  

  安装完成之后,我们便可以在页签上看到这个新增的插件。

  

④、配置远程连接

  不管是远程连接Tomcat还是jar包,都和介绍JConsole一模一样,详情请参考上面的配置。

⑤、使用文档

  对于JVisualvm,官方有详细的中文文档说明,如下:

  https://visualvm.github.io/documentation.html

  

Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化的更多相关文章

  1. Java集合详解及List源码分析

    对于数组我们应该很熟悉,一个数组在内存中总是一块连续的存储空间,数组的创建使用new关键字,数组是引用类型的数据,一旦第一个元素的位置确定,那么后面的元素位置也就确定了,数组有一个最大的局限就是数组一 ...

  2. Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行

    通过前面的几篇博客,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的.但是话又说回来,在实际生产环境中,线上项目正在运行 ...

  3. Java虚拟机详解----JVM常见问题总结

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. C++调用JAVA方法详解

    C++调用JAVA方法详解          博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...

  5. Java ClassLoad详解

    Java ClassLoad详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1. ...

  6. java关键字(详解)

    目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...

  7. java对象详解

    java对象及线程详解 内存布局 普通对象布局 数组的内存布局 内部类的内存布局 对象分解 对象头-mark word(8字节) 实例数据 对齐填充(可选) java锁分析 volatile关键字 v ...

  8. Java ClassLoader详解(转载)

    Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...

  9. 「万字图文」史上最姨母级Java继承详解

    摘要:继承是面向对象软件技术中的一个概念.它使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用. 本文分享自华为云社区<「万字图文」史上最姨母级Java继承详解丨[奔跑吧!JAVA] ...

  10. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

随机推荐

  1. cookbook_数据结构和算法

    1.1将数据分解为单独的变量 list_a = [1,2,3,4,5,6,7,8,9] a,b,c,d,e,f,g,h,i = list_a print(a,b,c,d,e,f,g,h,i) #使用相 ...

  2. 滚动视图、列表视图[ListView、SimpleAdapter类]

    滚动视图 <ScrollView android: layout_width="fill_parent" android: layout_height="fill_ ...

  3. 最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这

    优化一览图 优化 笔者将优化分为了两大类:软优化和硬优化.软优化一般是操作数据库即可:而硬优化则是操作服务器硬件及参数设置. 1.软优化 1)查询语句优化 首先我们可以用EXPLAIN或DESCRIB ...

  4. IOS应用无法下载、此时无法安装应用程序

    无法安装应用 app开发者,进行程序测试,重试还不行,就重新打包, 个人,更改wifi的dns 在“设置” –> “WiFi” –> 进入当前的WiFi 进入之后点击旁边的叹号,然后进入之 ...

  5. Spring源码解析——循环依赖的解决方案

    一.前言 承接<Spring源码解析--创建bean>.<Spring源码解析--创建bean的实例>,我们今天接着聊聊,循环依赖的解决方案,即创建bean的ObjectFac ...

  6. 自定义SWT控件二之自定义多选下拉框

    2.自定义下拉多选框 package com.view.control.select; import java.util.ArrayList; import java.util.HashMap; im ...

  7. WebRTC:一个视频聊天的简单例子

    相关API简介 在前面的章节中,已经对WebRTC相关的重要知识点进行了介绍,包括涉及的网络协议.会话描述协议.如何进行网络穿透等,剩下的就是WebRTC的API了. WebRTC通信相关的API非常 ...

  8. Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现

    Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现 一.漏洞描述 该漏洞出现在fileserver应用中,漏洞原理:ActiveMQ中的fileserver服务允许用户通 ...

  9. 数据结构之二叉树的构建C++版

    二叉树的构建要注意与链式表的区别,二叉树这里的构建十分低级,每个树只是构建了一个单一的二叉树节点,总体来看是有下向上构建的.用户需要手动去构建自己需要的树,而不是直接去插入数据就到二叉树中了,因为不是 ...

  10. 解读 PHP 的 P++提案

    解读 PHP 的 P++提案 周末看到一篇文章说 PHP 创始人提议将 PHP 拉出新分支,创建 P++ 语言.随后阅读了一下 Zeev Suraski 发起的这个邮件列表,大致了解了一下,这里做个解 ...