在平时的开发当中我们总是会遇到各种各样的问题,比如说内存泄漏、死锁、CPU等。遇到问题不可怕,关键是我们如何去排查这些错误,对症下药才是根本。不过对于很多人来说,往往找不到这些问题的根本所在,因此这篇文章主要是让我们掌握一些工具来分析到底是哪里出现了问题。
在之前的文章中,主要是分析了JVM的内存结构、类加载机制和垃圾回收机制。文章的顺序也是循序渐进的,从这篇文章当中我们主要是分析JDK自带的工具,把理论应用于实践。
首先我们先对几种要讲的工具进行一个概述,然后再分别分析:
一、性能监控工具概述
工具主要是为了解决问题而生的,就是由于我们的程序存在着一些性能问题,才有了这些工具。其实当我们在下载完成JDK之后,那些工具就被SUN公司随之送给我们了。
我们可以在我们的JDK安装目录,下看看会有很多这样的工具。
我们会发现很多这样的exe文件,这里面有很多都是性能监控工具。我们就抽出来几个进行讲解。
工具名称
主要作用
jps(JVM Process Status Tool)
显示指定系统中所有的HotSpot虚拟机进程
jstat(JVM Statistics Monitoring Tool)
收集HotSpot虚拟机各方面的运行数据
jinfo(Configuration Info for Java)
显示虚拟机配置信息
jmap(Memory Map for Java)
生成虚拟机的内存转储快照(heapdump文件)
jhat(JVM Heap Dump Browser)
分析内存转储快照,不推荐使用,消耗资源而且慢
jstack(Stack Trace for Java)
显示虚拟机的线程快照
JConsole
JMX的可视化管理工具
VisualVM
多合一故障管理工具
常见的几个工具都已经列出来了,还有一些其他的工具,其实用起来比JDK自带的还要好,我会在今后的文章中列出来。OK,我们就一个一个去分析一下这些工具是干嘛的,以及如何去使用的。
二、工具
1、jps:虚拟机进程状况工具
jps主要用来输出JVM中运行的进程状态信息。语法格式如下:
`jps [options] [hostid]
`
第一个参数:options
`-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数
`
第二个参数:hostid
主机或者是服务器的id,如果不指定,就默认为当前的主机或者是服务器。
我是在Windows10系统下测试的,当然你可以在linux下试验,方式是一样的,结果可能有不同。你可以选择不同的参数选项来进行测试。打开CMD输入相应命令
2、jstack:堆栈跟踪工具
jstack用于生成虚拟机当前时刻的线程快照。语法格式如下:
`jstack [option] vmid
`
第一个参数:option
选项
作用
-F
当正常输出的请求不被相应时候,强制输出线程堆栈
-l
出堆栈外,显示关于锁的附加信息
-m
如果调用本地方法的话,可以显示C/C++的堆栈
第二个参数:vmid
vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID。
我们直接在CMD中操作一下:
3、jstat:虚拟机统计信息监控工具
jstat监视虚拟机各种运行状态信息,可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。语法格式如下:
`jstat [ generalOption | outputOptions vmid [interval] [count]] ]
`
第一个参数:generalOption | outputOptions
这个参数表示的option,代表着用户希望查询的虚拟机信息,分为类加载、垃圾收集、运行期编译状况3类。
第二个参数:vmid
vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID。
第三个参数:interval
interval是采样时间间隔,
第四个参数:count
count表示的是采样数。
下面我们就是用一下这个工具,打开我们的CMD,输入相应的命令:
4、jinfo:实时地查看和调整虚拟机各项参数
命令格式:
`jinfo [option] pid
`
第一个参数:option
选项
作用
-v
查看虚拟机启动时显示指定的参数列表
-flag
查看虚拟机启动时未被指定的参数的默认值
-sysprops
打印虚拟机进程的System.getProperties()的内容
第二个参数:pid
指定显示的进程id。
在CMD中进行测试:
5、jmap:生成虚拟机的内存转储快照(heapdump文件)
jmap(Memory Map for Java,内存映像工具),用于生成堆转存的快照,一般是heapdump或者dump文件。如果不适用jmap命令,可以使用-XX:+HeapDumpOnOutOfMemoryError参数,当虚拟机发生内存溢出的时候可以产生快照。或者使用kill -3 pid也可以产生。jmap的作用并不仅仅是为了获取dump文件,它可以查询finalize执行队列,java堆和永久代的详细信息,如空间使用率,当前用的哪种收集器。命令格式如下:
`jmap [option] vmid
`
第一个参数:
第二个参数:vmid
vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID.
在cmd中测试:
6、jhat:分析内存转储快照,不推荐使用,而且慢
由于这个工具功能比较简陋,运行起来也比较耗时,所以这个工具不推荐使用,推荐使用MAT。
7、JConsole:JMX的可视化管理工具
这个工具相比较前面几个工具,使用率比较高,很重要。它是一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。
在cmd里面输入 jconsole,选则进程就可以了。(前提是在IDE工具先建立一个线程运行着)
然后我们选择了相应的选项之后,进入这个工具就会出现下面这个界面
在上面有菜单,我们可以选择其中一个进行查看,就可以了,这个用具用起来很方便,也是我之前用的比较多的工具。
8、VisualVM:多合一故障管理工具
这个工具也很牛bility。它同jconsole都是一个基于图形化界面的、可以查看本地及远程的JAVA GUI监控工具,Jvisualvm同jconsole的使用方式一样,直接在命令行打入jvisualvm即可启动,jvisualvm界面更美观一些,数据更实时:
最上面也有菜单,你可以选择不同的选项来展示。自己动手试一遍是最好的。
三、总结
这些工具就先写这么多,在文章一开始我们其实已经发现了,jdk自带的工具那是超级的多,而且随着jdk版本的不断更新,工具还有不断加强增多的趋势,想要每一个都掌握那太费时间了,我们遇到哪些问题去搜索一下,看看能用到哪些工具就可以了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。