基于JVisualVM的可视化监控

摘要:
监控本地的java进程本小节我们介绍一下如何使用JDK自带的jvisualvm工具来监控本地的Java进程,该工具是一个图形化的监控工具。jvisualvm在哪jvisualvm位于JAVA_HOME/bin目录下,如下图:直接双击就可以打开该程序,打开后界面如下:如果只是监控本地的java进程,是不需要配置参数的,直接打开就能够进行监控。
监控本地的java进程

本小节我们介绍一下如何使用JDK自带的jvisualvm工具来监控本地的Java进程,该工具是一个图形化的监控工具。

jvisualvm官方文档地址如下:
https://visualvm.github.io/documentation.html

介绍

VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的).
从界面上看还是比较简洁的,左边是树形结构,自动显示当前本机所运行的Java程序,还可以添加远程的Java VM,其中括号里面的PID指的是进程ID。OverView界面显示VM启动参数以及该VM对应的一些属性。Monitor界面则是监控Java堆大小,Permgen大小,Classes和线程数量。jdk不同版本中界面会不太一致,如有的含cpu监控,有的则不含(jdk1.6.0_10未包含)。

JVisualVM能做什么

VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。

jvisualvm在哪

jvisualvm位于JAVA_HOME/bin目录下,如下图:
基于JVisualVM的可视化监控第1张
直接双击就可以打开该程序,打开后界面如下:
基于JVisualVM的可视化监控第2张
如果只是监控本地的java进程,是不需要配置参数的,直接打开就能够进行监控。首先我们需要在本地打开一个Java程序,例如我打开IDEA,这时在jvisualvm界面就可以看到与IDEA相关的Java进程了:
基于JVisualVM的可视化监控第3张
点击一个进程,就可以看到该进程的概述信息,该进程的JVM参数以及系统属性等信息都能够查看到:
基于JVisualVM的可视化监控第4张
点击 “监视” 就能够看到CPU、内存、类以及线程的活动状况,点击右上角的 “堆Dump” 就能够导出内存映像文件:
基于JVisualVM的可视化监控第5张
除了导出,也还可以导入内存映像文件,只不过分析功能上没有MAT强大:
基于JVisualVM的可视化监控第6张
点击 “线程” 就能够看到该进程内部的所有线程,以及线程的运行状况等信息。如果点击右上角的 “线程Dump” 就会导出一个内容与jstack打印内容一致的文件:
基于JVisualVM的可视化监控第7张
点击 “抽样器” 界面中的 “CPU ” 就可以动态的看到每个方法的执行时间,当我们的代码执行的比较慢了,就可以通过抽样器来查看是哪一个方法执行的比较慢:
基于JVisualVM的可视化监控第8张
而点击 “内存” 的话,就可以实时的、动态的查看到每个类实例对象的数量以及这些实例所占用的内存大小:
基于JVisualVM的可视化监控第9张
在Profiler界面上,可以对CPU、内存进行性能分析,分析后会给出分析结果:
基于JVisualVM的可视化监控第10张
接下来我们下载两个比较实用的插件,首先到VisualVM插件中心,地址如下:
https://visualvm.github.io/pluginscenters.html
因为有时候自带的插件地址可能无法使用,所以我们需要自行配置可用的地址:
基于JVisualVM的可视化监控第11张
回到jvisualvm中,点击菜单栏中的 “工具“ 选项,再点击子菜单的 ”插件“ 选项:
基于JVisualVM的可视化监控第12张
然后按照下图配置插件地址:
基于JVisualVM的可视化监控第13张
配置好插件地址后,按照下图勾选以下两个插件:
基于JVisualVM的可视化监控第14张
按照提示一步步的进行安装:
基于JVisualVM的可视化监控第15张
基于JVisualVM的可视化监控第16张
安装完成:
基于JVisualVM的可视化监控第17张
插件安装完成后需要重启jvisualvm才会生效,这时会看到选项卡中多了一个 “Visual GC” 选项,点击该选项后,可以动态的查看到JVM内存结构各个区域的运行状况,极大方便我们进行各个区内存的监控及调优:
基于JVisualVM的可视化监控第18张
另一个插件的作用就是可以让我们针对某个进程编写BTrace脚本,右键点击一个进程,在弹出来的菜单中,选择“Trace application...”,就可以编写BTrace脚本了:
基于JVisualVM的可视化监控第19张

监控远程的java进程

在上一小节中,我们简单介绍了如何使用JDK自带的jvisualvm工具来监控本地的Java进程。而本小节我们将介绍一下如何使用jvisualvm来监控远程的java进程,我们这里以线上服务器的Tomcat为例。
打开jvisualvm,双击 “远程” 选项,添加一个远程主机,即远程的服务器:
基于JVisualVM的可视化监控第20张
然后编辑Tomcat的catalina.sh文件,在该文件中加入如下配置内容:

[root@server ~]# vim /home/tomcat/apache-tomcat-8.5.8/bin/catalina.sh
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=119.23.250.83"

配置简单说明:

-Dcom.sun.management.jmxremote添加一个jmx远程连接属性
-Dcom.sun.management.jmxremote.port=9004 指定连接的端口号
-Dcom.sun.management.jmxremote.authenticate=false 是否启用验证
-Dcom.sun.management.jmxremote.ssl=false 是否启用ssl
Djava.net.preferIPv4Stack=true 是否优先使用ipv4
-Djava.rmi.server.hostname=119.23.250.83 指定远程主机的ip地址
如下图:
基于JVisualVM的可视化监控第21张
增加完配置后,重启Tomcat,查看是否有9004端口,有的话就代表配置成功了,如下:

[root@server ~]# netstat -lntp |grep java
tcp        0      0 0.0.0.0:9004            0.0.0.0:*               LISTEN      13399/java          
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      13399/java          
tcp        0      0 0.0.0.0:46199           0.0.0.0:*               LISTEN      13399/java          
tcp        0      0 0.0.0.0:32859           0.0.0.0:*               LISTEN      13399/java          
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN      13399/java          
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN      13399/java          
[root@server ~]#

回到jvisualvm中,添加JMX连接,配置连接地址和端口,如下:
基于JVisualVM的可视化监控第22张
基于JVisualVM的可视化监控第23张
注意,如果你使用的是阿里云等云服务器的话,不仅需要配置防火墙规则来开放端口,还需要到云服务器的安全组规则中,增加相应的端口规则,如下:
基于JVisualVM的可视化监控第24张
连接成功后,如下:
基于JVisualVM的可视化监控第25张
同样的,可以像监控本地进程一样,监控远程的进程,在界面的操作上是一模一样的。唯一不同的也就是需要添加一个远程主机,然后到远程的Java进程上配置一些jmx参数而已:
基于JVisualVM的可视化监控第26张
以上我们是以Tomcat这种服务型的进程作为一个示例,只需要去配置Tomcat的脚本文件就可以了。那么如果我们需要监控的是自己线上跑的一个Java进程需要怎么进行配置呢?其实也是一样的,同样的是使用这些参数,只不过是作为启动参数而已,在启动项目的时候加上即可,如下:

[root@server ~]# nohup java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9005 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=119.23.250.83 -jar monitor_tuning-0.0.1-SNAPSHOT.jar &

成功启动后,也是使用同样的方式进行连接,注意端口不要弄错了:
基于JVisualVM的可视化监控第27张
连接成功后也是一样的:
基于JVisualVM的可视化监控第28张
然后我们就可以愉快的在本地监控远程的Java进程了,而且还是图形化的,免去了敲命令的烦恼。
我们来做一个堆内存溢出的实验,看看jvisualvm能否监控到内存的变化,在浏览器上访问我们之前在基于JDK命令行工具的监控一文中所编写的/head接口。访问后如下,可以看到堆内存的变化很激烈,利用jvisualvm工具进行监控,就很明显的就能够观察到该进程的异常:
基于JVisualVM的可视化监控第29张
所以线上监控不能少,是我们必须要掌握的一种技能。监控相当于我们的眼睛,如果没有监控工具,那我们就相当于瞎子一样两眼一抹黑。无法看到内存、线程的使用情况,当出现异常的时候,也难以定位问题发生的原因。

参考文档

jvisualVM:

https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/index.html
https://visualvm.github.io/documentation.html
jvisulaVM如何添加插件

https://visualvm.github.io/index.html
原文转载:基于JVisualVM的可视化监控

免责声明:文章转载自《基于JVisualVM的可视化监控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Neo4j查询优化系列】如何快速统计节点的关系数解决C# WINFORM程序只允许运行一个实例的几种方法详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于WebGL架构的3D可视化平台—三维设备管理(ThingJS实现楼宇设备管理3D可视化)

国内高层建筑不断兴建,它的特点是高度高、层数多、体量大。面积可达几万平方米到几十万平方米。这些建筑都是一个个庞然大物,高高的耸立在地面上,这是它的外观,而随之带来的内部的建筑设备也是大量的。为了提高设备利用率,合理地使用能源,加强对建筑设备状态的监视等,自然地就提出了楼宇自动化控制系统。下面我们将用ThingJS平台来模拟一个设备管理系统。 第一步,利用C...

c++ windows下计时

多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间 陈硕Blog.csdn.net/Solstice 自从 Intel Pentium 加入 RDTSC 指令以来,这条指令是 micro-benchmarking 的利器,可以以极小的代价获得高精度的 CPU 时钟周期数(Time Stamp Counter),不少介绍优化的文章[1]和书籍用...

ThreadPool.QueueUserWorkItem的性能问题

在WEB开发中,为了减少页面等待时间提高用户体验,我们往往会把一些浪费时间的操作放到新线程中在后台运行。 简单的实现代码就是: //代码一 new Thread(()=>{ //do something }).Start();   但是对于一个请求量大的网址这样做是很不现实的——每一个操作都要开启一个新线程,最终会因CPU不堪重负而...

pktgen网络测试工具介绍

  网上有很多讲解pktgen的文章,但总是不够全面细致,看完之后自己还是不会写pktgen测试脚本,为此本文对pktgen进行详细的阐述,让大家看完本文后能够自己动手写pktgen shell.   1.pktgen简介   pktgen是一个位于linux内核层的高性能网络测试工具,由瑞士皇家理工大学的TSlab实验室的Robert Olsson开发的...

这几个IDEA高级调试技巧,用完就是香

一个项目启动两次 测试分布式项目时,经常要一个项目启动2次,不用将一个项目打开多次启动,配置一下即可 1.点击Edit Configurations 2.勾选Allow parallel run 3.依次点击如下2个按钮 条件断点 有如下代码,只想让它在i == 10的情况下停下来 @Test public void condition() {...

[译]GPUView

【本文翻译自GPUView的开发者Matt的blog.  https://graphics.stanford.edu/~mdfisher/GPUView.html  】 【 GPUview可以在 https://docs.microsoft.com/en-us/windows-hardware/get-started/adk-install 这里下载到】...