Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化
上篇博客我们介绍了虚拟机监控和分析命令行工具,由于其不够直观,不是很容易排查问题,那么本篇博客我们就来介绍几个可视化工具。
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)——可视化的更多相关文章
- Java集合详解及List源码分析
对于数组我们应该很熟悉,一个数组在内存中总是一块连续的存储空间,数组的创建使用new关键字,数组是引用类型的数据,一旦第一个元素的位置确定,那么后面的元素位置也就确定了,数组有一个最大的局限就是数组一 ...
- Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行
通过前面的几篇博客,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的.但是话又说回来,在实际生产环境中,线上项目正在运行 ...
- Java虚拟机详解----JVM常见问题总结
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- Java ClassLoad详解
Java ClassLoad详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1. ...
- java关键字(详解)
目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...
- java对象详解
java对象及线程详解 内存布局 普通对象布局 数组的内存布局 内部类的内存布局 对象分解 对象头-mark word(8字节) 实例数据 对齐填充(可选) java锁分析 volatile关键字 v ...
- Java ClassLoader详解(转载)
Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...
- 「万字图文」史上最姨母级Java继承详解
摘要:继承是面向对象软件技术中的一个概念.它使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用. 本文分享自华为云社区<「万字图文」史上最姨母级Java继承详解丨[奔跑吧!JAVA] ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
随机推荐
- [系列] Gin框架 - 数据绑定和验证
目录 概述 推荐阅读 概述 上篇文章分享了 Gin 框架使用 Logrus 进行日志记录,这篇文章分享 Gin 框架的数据绑定与验证. 有读者咨询我一个问题,如何让框架的运行日志不输出控制台? 解决方 ...
- PHPStrom激活方法【亲测有效2018.4.23】
直接用浏览器打开 http://idea.lanyus.com/ 点击页面中的"获得注册码", 然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串 ...
- Mysql优化(出自官方文档) - 第三篇
目录 Mysql优化(出自官方文档) - 第三篇 1 Multi-Range Read Optimization(MRR) 2 Block Nested-Loop(BNL) and Batched K ...
- jsp数据交互(二).3
01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...
- PHP Composer安装使用
1.安装composer curl -sS https:\\getcomposer.org/install | php 如果出现这样的提示,打开php.ini检查是否开启openssl扩展 2.下载成 ...
- TCP传输协议如何进行拥塞控制?
拥塞控制 拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象.这种现象跟公路网中 ...
- maven添加oracle驱动包
问题描述 项目用到了oracle,但由于oracle商业版权问题,maven在中心资源库直接下载jar包是要收费的 解决方法 第一步: 下载ojdbc6.jar 第二步: 将下载的jar放入项目的li ...
- java并发笔记之四synchronized 锁的膨胀过程(锁的升级过程)深入剖析
警告⚠️:本文耗时很长,先做好心理准备,建议PC端浏览器浏览效果更佳. 本篇我们讲通过大量实例代码及hotspot源码分析偏向锁(批量重偏向.批量撤销).轻量级锁.重量级锁及锁的膨胀过程(也就是锁的升 ...
- F#周报2019年第31期
新闻 现在开始接受FSSF的第七次师友计划申请 Xamarin播客:XAML热重载 TorchSharp:将PyTorch引擎带入.NET 视频及幻灯片 F#中的异步编程2/3--实现异步工作流 ML ...
- Redis分布式锁实战
什么是分布式锁 在单机部署的情况下,要想保证特定业务在顺序执行,通过JDK提供的synchronized关键字.Semaphore.ReentrantLock,或者我们也可以基于AQS定制化锁.单机部 ...