tags: java, troubleshooting, monitor,jvisualvm,jconsolehtml
一句话归纳:jdk自己自带的监控工具jconsole和jvisualvm能够更方便,更直观地对java应用进行性能监测,下文为你讲解如何使用它们。java
前面几篇文章(见下文“相关阅读”)已经对jdk的命令行工具进行了介绍,但它们使用起来相对仍是不够直观,并且通常都须要在本机上使用,有没有更方便,更直观的方式来对java应用进行监测?其实,jdk自己已经提供了java监测的GUI工具,分别是jconsole
和jvisualvm
,下面对这两款工具的功能及使用进行描述。git
jconsole是jdk一个内置Java性能分析器,在JDK安装目录下的bin目录,在windows下,能够从命令行(jconsole.exe
)或直接双击jconsole.exe启动运行。读者有兴趣能够参考jconsole工具的官方使用文档:https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html
程序员
jconsole启动时,会提供两种链接方式,分别是链接本地进程和链接远程进程。它会直接列出本地java进程来选择。如果须要监测远程的java进程,则勾选远程进程,而后输入:。这须要远程的java进程启动时,设置JMX的远程链接参数,不然是没法链接的,关于远程链接的JMX技术,能够参考官方文章(https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html
)参数分别是如下几个:github
# 须要监控的服务器IP
-Djava.rmi.server.hostname=192.168.222.10
# 提供监控的java进程端口
-Dcom.sun.management.jmxremote.port=9004
# 指定后续的通信端口,与上面一致
-Dcom.sun.management.jmxremote.rmi.port=9004
# 不使用ssl登陆,如有安全需求,可设置
-Dcom.sun.management.jmxremote.ssl=false
# 不验证,如有安全需求,可设置
-Dcom.sun.management.jmxremote.authenticate=false
复制代码
以下图所示:shell
注意,因为不使用ssl
,会提示"不安全链接",点击它便可。数据库
启动并链接java进程后,jconsole的界面是比较简洁的,分为6个模块:windows
概览主要显示堆,线程数,类,CPU占用率的变化折线图,基本上能够直接根据折线图来查看应用概况。若是堆占用内存很高,活动线程数不少,CPU占用率很高,那就能够直接进入到相应的区域看详细内容来查找缘由了。另外,右击对应的图,能够把数据导出到csv文件来分析。如图:安全
内存是咱们监测的重点区域,能够参看堆内存,非堆内存,内存池的情况,GC次数和时间,能够手动进行GC查看内存变化。以下图:bash
其中,图的上方能够选择查看哪一个内存的变化(堆、非堆,old区,eden区,survivor区,metaspace区等),也能够手动执行GC查看变化状况。图下方有显示内存的大小及使用大小,GC的次数和使用时间,同时以柱状图的方式来显示堆和非堆的变化。所以,对于有内存溢出,OOM这些问题,看这里的监测数据很是适合。
线上应用,线程长时间停顿的主要缘由主要有:等待外部资源(数据库链接、网络资源、设备资 源等)、死循环、锁等待(活锁和死锁),这些都须要监测java应用的线程运行情况,以下图:
线程数变化状况及点击某个线程查看运行状态来分析,其中还能够点击“检测死锁”功能来处理死锁问题。
此功能主要用于查看加载的类总数,若是加载的类一直在增长,就得查看代码是否有不断产生类的代码了。以下图:
当咱们对java应用添加了启动参数( JAVA_OPTS
),若想在线上查看此应用的实际使用状况,参数是否生效,命令行工具咱们是用jinfo,如今在这里能够直接看到,并且包括了系统信息,类信息,堆信息及相关的VM参数。以下图:
与jconsole
相似,jdk在bin目录下还提供了jvisualvm
工具,相对来讲,jvisualvm
更为强大,在windows下,能够从命令行(jvisualvm.exe
)或直接双击jvisualvm.exe
启动运行。读者有兴趣能够参考jvisualvm
工具的官方使用文档:https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/index.html
跟jconsole
同样,jvisualvm
能够监测本地的java进程,也能够监测远程的java进程。本地进程直接选择便可,远程进程一样须要java进程添加JMX启动参数。
jvisualvm的功能比较强大,主要包括如下几项功能:
界面上的功能主要分为几大模块,分别是概述、监视、线程、抽样器。
概述至关是java命令行工具中的jps
及jinfo
,能够显示进程以及进程的配置、系统属性,启动参数等,与jconsole
的"VM概要"差很少。以下图:
此功能至关于jconsole
的"概览"功能,一样是以图形化的方式,显示CPU、堆变化、线程数变化及加载类状况,但它有一个功能是能够远程dump出堆转储快照(至关于jmap -dump:file=./heap.hprof PID
),dump时会选择文件存储位置。
dump出的堆快照,咱们能够手动把文件下载下来,而后使用它的“装入快照”功能加载到jvisualvm
(装入时须要选择文件类型是以"hprof"类型),进一步分析堆的内存状况。装入后,会包含概要信息,类和实例占用内存状况,双击类还能够看到具体的实例数,如果发现某些类的实例数不少,或者占用的内存大小比较高,则能够知道问题所在。以下所示:
此此功能至关于jconsole
的"线程"功能,但更丰富,它把每一个线程的运行状态,运行时间都以图形化的方式显示,同时还能够进行远程线程dump,这个功能,其实就是jstack -l
功能,dump出来后,直接显示到界面中。以下:
抽样器是jvisualvm
的独有功能,能够对CPU和内存进行抽样显示,每隔一段时间把内存信息,线程信息,能够很方便的集中精力分析某一段时间的数据变化(能够以层级方式显示细到方法的执行时间,类占用内存状况等),同时也提供执行GC、内存dump及线程dump功能。以下:
有了jconsole
和jvisualvm
两款可视化工具,能够减小命令行的输入,以更方便,更直观的方式来监测java应用的内存、线程、CPU等信息,是处理java线上问题的好帮手。不过要注意一点的是,使用这两款工具以前,咱们仍是须要对JVM,Java程序运行机制,线程等知识有必定的积累。但愿本文对你们有帮助。
https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html
https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/index.html
https://visualvm.github.io/documentation.html
https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html
https://github.com/mianshenglee/my-example/tree/master/java-monitor-example