当JVM发生故障的时候,能应用JDK命令行工具对JVM进行监控和故障诊断是Java开发人员必备的技能之一。本篇文章将为大家带来JVM进行监控和故障诊断常用的命令行工具,如下图:
其中jps、jstat、jinfo、jmap、jhat、jstack从JDK 1.5开始就已经存在,jcmd是在JDK 1.7引入的。
1、 jps
格式:jps [参数] [远程主机名,需要远程主机开通rmi远程调用,此参数为空表示本机]
参数如下图示:
示例:
2、 jstat
格式:
jstat [参数] pid [间隔时间:单位毫秒] [统计次数]
参数如下图示:
示例:
使用jstat查看gc情况时,重点关注一下信息:
类的加载及卸载情况;
查看新生代、老生代及持久代的容量及使用情况;
查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间;
查看新生代中Eden区及Survior区中容量及分配情况等。
3、 jinfo
格式:jinfo [参数] pid
参数如下图示:
示例:
4、 jmap
格式:
jmap [参数] pid
参数如下图示:
示例:
5、 jhat
格式:
jhat [参数] [dumpfile:jmap生成的dump文件]
与jmap搭配使用,来分析jmap生成的堆转储快照。不过一般不建议使用此工具,dump文件的分析一般耗时又耗费资源,直接的在本机分析会严重影响性能,另外jhat分析结果相对简陋,所以一般都是将dump下载到另外的机器用jvisualvm进行分析以得到更为直观的分析结果。
6、 jstatck
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。所以jstatck一般用来定位线程出现长时间停顿的原因,如如线程间死锁、死循环等。
格式:
jstack [参数] pid
示例:
由于jstack输出的信息较多,所以上述示例是将线程快照打印到sample.txt文件中,然后下载sample.txt到本机进行分析,下图为sample.txt文件的部分内容:
分析线程快照时需要关注以下信息:
Deadlock:表示有死锁
Waiting on condition:等待某个资源或条件发生来唤醒自己
Blocked:表示线程阻塞
Waiting on monitor entry:在等待获取锁
7、 jcmd
在JDK1.7以后,新增的一个多功能命令行工具,可以通过此命令发送诊断命令,从完成导出堆、查看Java进程、导出线程信息、执行GC、采样分析等功能;
格式:
jcmd <pid | main class> <command … | PerfCounter.print | -f file>
Jcmd的主要用途:
小结
以上为大家带来了常用的JDK监控和故障处理的命令行工具,重点是jstat,jmap和jstack三个命令行工具,jcmd是JDK1.7后才引入,它涵盖了jps,jinfo,jstat,jmap和jstack的部分功能,也可以花时间了解下。后续我们还会带来更精彩的内容,感兴趣的同学可以关注我们的微信公众号。