JVM性能监控工具介绍

当系统遇到一些问题或者异常的时候,我们往往会查看系统日志、JVM堆栈、GC日志,或者查看线程快照、堆转储快照等信息,然后进行一个客观的分析,最后找到问题。而查看这些最常用的就是JVM自带的监控分析工具,存在于JAVA_HOME/bin下面:

JVM性能监控工具介绍_第1张图片
JVM自带的监控工具

其中最常用的就是:jps、jstat、jinfo、jmap、jhat、jstack 这6个命令行工具,以及jconsole和jvisualvm两个可视化工具。

jps(JVM Process Status Tool,虚拟机进程监控工具)

这个命令可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及这些进程的本地虚拟机唯一ID。这个ID被称为本地虚拟机唯一ID(local virtual Machine Identifier,简写为LVMID)。如果你在linux的一台服务器上使用jps得到的LVMID其实就是和ps 命令得到的PID是一样的。

jps的命令格式:jps [options] [hostid],其实使用比较多的参数是:-lv。-v 是输出:虚拟机进程启动时的JVM参数,-l 输出主类的全名,如果进程执行的是jar包,则输出Jar路径。

jps -lv

jstat(JVM Statistics Monitoring Tool,虚拟机统计信息监视工具)

这个命令用于监视虚拟机各种运行状态信息。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,虽然没有GUI图形界面,只是提供了纯文本控制台环境的服务器上,但它是运行期间定位虚拟机性能问题的首选工具。

jstat的命令格式:jstat [option vmid [interval [s | ms] [count ] ] ],命令格式比较复杂,但是有用的也就是几个,我们一般都是登录到服务器上进行查看,不适合用远程的方式查看问题。整个命令格式翻译过来就是:jstat [参数] LVMID [查询的间隔时间] [查询的次数],如果将查询的间隔时间和查询的次数去掉的话,说明只是查询一次。举个例子,例如:需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:jstat -gc 2764 250 20;jstat的参数有很多,这里有个截图:

JVM性能监控工具介绍_第2张图片
来自《深入理解Java虚拟机》

jinfo (Configuration Info for Java,配置信息工具)

这个命令可以实时地查看和调整虚拟机各项参数。使用方式如下图:

JVM性能监控工具介绍_第3张图片
jinfo命令

jmap(Memory Map for Java,内存映像工具)

jmap用于生成堆转存的快照,一般是heapdump或者dump文件。如果不适用jmap命令,可以使用-XX:+HeapDumpOnOutOfMemoryError参数,当虚拟机发生内存溢出的时候可以产生快照。或者使用kill -3 pid也可以产生。jmap的作用并不仅仅是为了获取dump文件,它可以查询finalize执行队列,java堆和永久代的详细信息,如空间使用率,当前用的哪种收集器。

jmap的命令格式:jmpa [option] vmid,一般他的参数有:

JVM性能监控工具介绍_第4张图片
jmap参数

如果想用jmap以二进制的形式输出4577进程的dump文件到本地的test.bin文件中,则命令是:jmap -dump:format=b,file=test.bin 4577

jhat(虚拟机堆转储快照分析工具)

jhat这个工具是用来分析jmap dump出来的文件。由于这个工具功能比较简陋,运行起来也比较耗时,所以这个工具不推荐使用,也不太会使用到。例如分析上面的test.bin,那就直接使用:jhat test.bin 就行了,这样他会在本地启动一个web服务,端口是7000,这样直接访问:127.0.0.1:7000就能看到分析结果了:

JVM性能监控工具介绍_第5张图片
jhat的分析结果

jstack:Java堆栈跟踪工具

这个命令用于查看虚拟机当前时刻的线程快照(一般是threaddump 或者 javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。生成线程快照的主要目的是定位线程出现长时间停顿的原因,入线程间死锁、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情。

命令格式:jstack [option] vmid,主要的option有三个,-F/-l/-m:

jstack

主要是把线程的堆栈信息打印出来查看线程堆栈中是否存在异常的情况,然后根据具体的情况做处理。

你可能感兴趣的:(JVM性能监控工具介绍)