龙空技术网

JDK自带可视化的java监控工具-Jvisualvm

测试小平 1165

前言:

而今兄弟们对“javaaix”大体比较讲究,兄弟们都需要学习一些“javaaix”的相关资讯。那么小编同时在网络上网罗了一些有关“javaaix””的相关文章,希望我们能喜欢,各位老铁们快快来了解一下吧!

1 简介

jvisualvm是可视化的java监控工具,java 1.6以后的自带此工具。

jvisualvm使用简单,几乎0配置,几乎包括其它JDK自带命令全部功能,主要功能如下:

(1)内存信息

(2)线程信息

(3)dump堆

(4)dump线程

(5)生成应用快照(包含内存信息,线程信息等)

(6)性能分析(CPU分析:各个方法调用时间,检查哪些方法占用CPU耗时过多;内存分析:各类对象占用的内存大小)

2 启动jvisualvm

前置条件:安装监控应用对应版本的JDK(注意:JRE是不包括jvisualvm工具)

2.1 远程监控

一般用于在windows机器运行jvisualvm工具,远程监控linux/AIX上的应用。

(1)对监控应用,添加JVM参数配置,如下:

-Dcom.sun.management.jmxremote=trure -Dcom.sun.management.jmxremote.port=8011 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

----------------------------------------------------------------------------------------------------

-Dcom.sun.management.jmxremote=trure 是否允许jmx远程访问

-Dcom.sun.management.jmxremote.port=8011 设置监控端口,设置为未被占用端口都可以

-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 表示是否需要进行认证,false表示不需要认证及不输入用户和密码。

(2)windows机器,JDK安装目录下bin中运行jvisualvm

启动jvisualvm

(2)选择“远程”,右击“添加主机”;输入对应监控服务器IP

添加操作

添加远程机

(4)点击添加主机,右击选择“添加jmx连接”;输入IP:port

添加jmx

添加jmx,输入ip和端口

端口为8011,是前面添加的java参数对应配置的端口值

(5)监控成功

监控成功

2.2 本地监控

一般用于当修改jvm修改不方便时,直接在Linux上启动本地jvisualvm进行监控。

前置条件:windows上安装xmanger工具中,并且运行xmanager - Passive程序。

我们在使用linux机器时,一般通过xshell进行访问,默认无法运行可视化窗体程序,如果需要运行窗体程序,需要windows上安装xmanger工具中(xmanager - Passive程序)

(1)运行jvisualvm

操作如下:

cd 进入jdk/bin下

export DISPLAY=IP:0

./jvisualvm

(2)启动成功,类似如下:

启动成功

2.3 启动注意事项和常见问题

(1)注意启动jvisualvm运行的jdk版本和监控应用程序的JDK版本,尽量保证版本一致

(2)在Linux上启动jvisualvm时,启动jvisualvm程序用户与应用程序启动的所属用户要一致,否则可能无法监控。

3 常用功能3.1 查看应用的CPU和内存,线程基本情况

点击“监视”,显示CPU、内存、线程基本情况

监控

CPU图中,观察java程序CPU使用情况,是否CPU使用率太高;如果当CPU使用情况大于80%,此时可能CPU存在瓶颈,此时分析具体分析CPU耗时方法情况;如果当垃圾回收活动大于10%时,表明GC很频繁需要对内存进行分析。

内存图中,观察堆和metaspace使用情况和变化情况,是否存在堆可用空间一直变小或FGC频率,当有问题时可打印dump文件进行分析

线程图,观察线程数和线程变化情况,是否线程数特别大或者突然增加情况或者频率变化情况,如果可以打印线程dump进行分析或者监控具体线程使用情况。

类图中,观察分析加载类数据量变化,是否存在加载类太多或者频率变化在现象。

3.2 查看线程运行情况

点击“线程”

线程运行情况

线程的时间线图实时显示了线程的状态。查看具体哪些线程正在运行,并且打印线程dump查看线程正在运行什么方法,是否存在死锁现象。重点关注Blocked的线程,也就是颜色是红色的线程。如果有大量线程的状态处于红色或者部分线程的状态长期处于红色,说明有线程被Blocked.可以使用右上角的线程dump功能生成dump文件来分析。

3.3 监控CPU

点击“抽样器”-->“CPU”

cpu热点监控

输出的内容中的信息有热点方法,自用时间占比,自用时间,自用时间(CPU)等。

其中的自用时间是方法自身执行的时间,不包括调用其他方法的时间。

自用时间(CPU)是方法自身消耗CPU的时间。

此界面显示CPU的实时结果。当自用时间比较高,表示方法的总体的执行时间比较长,可能是方法单次执行的时间比较短,但执行的次数多;或者单次的执行耗时间长。自用时间(CPU)比较高表示方法比较耗CPU。对于CPU密集型的应用,热点方法的自用时间和自用时间CPU一般很接近。监控时,可以根据自用时间或者自用时间(CPU)进行排序。可以快速定位到消耗CPU的热点方法。

同时也可以监控到线程占用cpu情况,点击“线程CPU时间”,如下图

线程cpu

监控各个线程,占用CPU时间情况。分析哪些线程占用CPU高,否是正常。并且监控线程CPU时,可以增量方式(点击“增量”),显示线程占用CPU,默认实时显示总计结果。

对定位到热点方法以后,有时需要知道方法的调用路径;点击CPU样列中“快照”,打印此刻的CPU调用情况。生成的快照的展示有几个维度,调用树,热点,组合,信息。最直观的是热点方法。如果是CPU消耗比较高,在“热点”方法的视图中按照“自用时间”(CPU进行排序),选择需要追踪的方法,后键点击“显示反向跟踪”就可以得到方法调用的路径。操作如下图:

cpu快照

在快照分析中,可选择某一方法,选择“显示反向跟踪”,查看方法调用信息。

显示反向跟踪

调用栈信息

上图中显示了热点方法的时间,时间(CPU),调用次数,以及调用的来源。通过这个图很清楚的知道方法的调用路径,以及调用次数之间的关系,也可以定位是否有循环调用。

3.4 监控内存

点击“抽样器”-->“内存”,实时监控内存

内存监控

通过一个线程内存情况,监控和分析。

线程内存分析

通过快照,分析内存对象情况。点击“快照”,打印此时刻的内存使用情况。分析类和实例数进行分析,重点分析占用内存大,top5的类和实例数。

内存快照

对于内存监控,我们可以优先查看监控页面中,内存基本使用情况,基本分析下,再结合实时监控,确定内存是否问题,哪个类可能存在问题。

对Heap的详细监控可以加载VisualGC插件(需要安装)

VisualGC动态视图

VisualGC

VisualGC动态视图动态展示了Old区,Eden区,s0/s1区的变化.通过观察这些区的变化来判断是否有内存问题。

安装VisualGC动态视图。点击“工具”-->“插件”中,选择安装VisualGC,重启jvisualvm,再次监控就会VisualGC动态视图

标签: #javaaix