JDK监控和故障处理命令行工具

来自:麻辣软硬件(微信号:VOSDeveloper),作者:cdk

当JVM发生故障的时候,能应用JDK命令行工具对JVM进行监控和故障诊断是Java开发人员必备的技能之一。本篇文章将为大家带来JVM进行监控和故障诊断常用的命令行工具,如下图:



其中jps、jstat、jinfo、jmap、jhat、jstack从JDK 1.5开始就已经存在,jcmd是在JDK 1.7引入的。

jps


格式:


jps [
参数] [远程主机名,需要远程主机开通rmi远程调用,此参数为空表示本机]


参数如下图示:


示例:

jstat


格式:

 
jstat [参数] pid [间隔时间:单位毫秒] [统计次数]


参数如下图示:


示例:


使用jstat查看gc情况时,重点关注一下信息:

1、类的加载及卸载情况;
2、查看新生代、老生代及持久代的容量及使用情况;
3、查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间;
4、查看新生代中Eden区及Survior区中容量及分配情况等。

jinfo

格式:

jinfo  [参数]  pid

参数如下图示:

示例:

jmap

格式:

   jmap [参数] pid

参数如下图示:

示例

jhat


格式:

 
jhat [参数] [dumpfile:jmap生成的dump文件]


与jmap搭配使用,来分析jmap生成的堆转储快照。不过一般不建议使用此工具,dump文件的分析一般耗时又耗费资源,直接的在本机分析会严重影响性能,另外jhat分析结果相对简陋,所以一般都是将dump下载到另外的机器用jvisualvm进行分析以得到更为直观的分析结果。

jstack


jstack
Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。所以jstatck一般用来定位线程出现长时间停顿的原因,如如线程间死锁、死循环等。


格式:

 
jstack [参数] pid


参数如下图示:


示例:


由于jstack输出的信息较多,所以上述示例是将线程快照打印到sample.txt文件中,然后下载sample.txt到本机进行分析,下图为sample.txt文件的部分内容:


分析线程快照时需要关注以下信息:

1、Deadlock:表示有死锁

2、Waiting on condition:等待某个资源或条件发生来唤醒自己

3、Blocked:表示线程阻塞

4、Waiting on monitor entry:在等待获取锁

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的部分功能,也可以花时间了解下。

推荐↓↓↓
Java编程
上一篇:Java性能监控和故障诊断可视化工具之一:jconsole 下一篇:SSI开发框架搭建学习实践