0%

JDK命令之两大系列使用总结

本文中,“JDK命令之两大系列”是指“Monitoring Tool系列”和“Troubleshooting Tool系列”。

一、Monitoring Tool系列

本系列下有JDK命令:jps,jstat,jstatd。

1.1、“-J”选项

执行“jps/jstat/jstatd”命令实质上会运行JVM进程,跟执行“java”命令运行JVM进程一样,执行“jps/jstat/jstatd”命令可传入“虚拟机参数”,只不过需要直接跟在“-J”选项后面,比如“-J-Xmx100M”,如果需要传入多个“虚拟机参数”,可配置多个“-J”选项,比如“-J-Xms50M -J-Xmx100M”。

1.2、使用模式

“jps/jstat”命令的使用有两种模式:本地模式和联网模式。以上两种模式下都只有“实时模式”这种模式。

1.2.1、本地模式

待被监控的JVM进程运行在本地主机上,“jps/jstat”命令也在本地主机上执行,无需执行“jstatd”命令。

1.2.1.1、实时模式

执行“jps和jstat”命令的形式分别如jpsjstat JVM进程ID

1.2.2、联网模式

待被监控的JVM进程运行在远端主机上,“jps/jstat”命令在本地主机上执行,需要在远端主机上执行“jstatd”命令。

1.2.2.1、实时模式

执行“jstatd”命令的形式如jstatd [-n ServerId];执行“jps和jstat”命令的形式分别如jps rmi://远端主机IP地址/ServerIdjstat -gcutil rmi://远端主机上JVM进程ID@远端主机IP地址/ServerId 1000 3

1.3、JVM进程间的通信机制

假定本地主机上执行“jps/jstat”命令运行的JVM进程为P1,本地主机上运行的待被监控的JVM进程或者JVM进程集合为P2;远端主机上执行“jstatd”命令运行的JVM进程为P3,远端主机上运行的待被监控的JVM进程或者JVM进程集合为P4。
JVM进程间的通信机制描述如表1。

表1

本地模式-实时模式 本地模式-离线模式 联网模式-实时模式 联网模式-离线模式
jps命令 P1与P2之间的通信机制为“jvmstat mechanism” P1与P3之间的通信机制为“RMI”,P3与P4之间的通信机制为“jvmstat mechanism”
jstat命令 P1与P2之间的通信机制为“jvmstat mechanism” P1与P3之间的通信机制为“RMI”,P3与P4之间的通信机制为“jvmstat mechanism”

1.4、使用总结

综上所述,使用“jps,jstat”命令时,采用“本地模式-实时模式”就好,不能采用“本地模式-离线模式”和“联网模式-离线模式”,没有必要采用“联网模式-实时模式”,原因主要有两点:1)如果采用,增加复杂性;2)执行“jps/jstat”命令运行的JVM进程不是GUI进程,因此根本没有必要以“执行‘jstatd’命令运行的JVM进程”作为代理者。

二、Troubleshooting Tool系列

本系列下有JDK命令:jinfo,jhat,jmap,jstack,jsadebugd。

2.1、“-J”选项

执行“jinfo/jhat/jmap/jstack/jsadebugd”命令实质上会运行JVM进程,跟执行“java”命令运行JVM进程一样,执行“jinfo/jhat/jmap/jstack/jsadebugd”命令可传入“虚拟机参数”,只不过需要直接跟在“-J”选项后面,比如“-J-Xmx100M”,如果需要传入多个“虚拟机参数”,可配置多个“-J”选项,比如“-J-Xms50M -J-Xmx100M”。

2.2、使用模式

“jinfo/jmap/jstack”命令的使用有两种模式:本地模式和联网模式。以上两种模式下又都有“实时模式”和“离线模式”这两种模式;“jhat”命令的使用只有“本地模式-离线模式(跟其他的“离线模式”不一样,以hprof格式文件为目标文件,其他“离线模式”以Core Dump File为目标文件)”方式。

2.2.1、本地模式

待被监控的JVM进程运行在本地主机上,“jinfo/jmap/jstack”命令也在本地主机上执行,无需执行“jsadebugd”命令。

2.2.1.1、实时模式

执行“jinfo,jmap和jstack”命令的形式分别如jinfo JVM进程IDjmap JVM进程IDjstack JVM进程ID

2.2.1.2、离线模式

执行“jinfo,jmap和jstack”命令的形式分别如jinfo Executable CoreDumpFilejmap Executable CoreDumpFilejstack Executable CoreDumpFile。其中“CoreDumpFile”表示Core Dump File的路径,“Executable”表示借以生成该Core Dump File的程序,以便能够以正确格式进行解析。

2.2.2、联网模式

待被监控的JVM进程运行在远端主机上,“jinfo,jmap和jstack”命令在本地主机上执行,需要在远端主机上执行“jsadebugd”命令。

2.2.2.1、实时模式

执行“jsadebugd”命令的形式如jsadebugd 远端主机上待被监控的JVM进程ID [ServerId];执行“jinfo,jmap和jstack”命令的形式如jinfo/jmap/jstack ServerId@远端主机IP地址

2.2.2.2、离线模式

执行“jsadebugd”命令的形式如jsadebugd Executable CoreDumpFile [ServerId];执行“jinfo,jmap和jstack”命令的形式如jinfo/jmap/jstack ServerId@远端主机IP地址

2.3、JVM进程间的通信机制

假定本地主机上执行“jinfo/jmap/jstack”命令运行的JVM进程为P1,本地主机上运行的待被监控的JVM进程为P2;远端主机上执行“jsadebugd”命令运行的JVM进程为P3,远端主机上运行的待被监控的JVM进程为P4。

JVM进程间的通信机制描述如表2。

表2

本地模式-实时模式 本地模式-离线模式 联网模式-实时模式 联网模式-离线模式
jinfo命令 P1与P2之间的通信机制:“-flag”选项,采用“Dynamic Attach”机制;“其他”选项,采用“Serviceability Agent”机制 P1直接读取文件 P1与P3之间的通信机制为“RMI”,P3与P4之间的通信机制为“Serviceability Agent” P1与P3之间的通信机制为“RMI”,P3直接读取文件
jmap命令 P1与P2之间的通信机制:“-dump”和“-histo”选项,采用“Dynamic Attach”机制;“其他”选项,采用“Serviceability Agent”机制(如果包含“-F”选项,则显式指定采用“Serviceability Agent”机制 P1直接读取文件 P1与P3之间的通信机制为“RMI”,P3与P4之间的通信机制为“Serviceability Agent” P1与P3之间的通信机制为“RMI”,P3直接读取文件
jstack命令 P1与P2之间的通信机制:“-m”选项,采用“Serviceability Agent”机制;“其他”选项,采用“Dynamic Attach”机制(如果包含“-F”选项,则显式指定采用“Serviceability Agent”机制 P1直接读取文件 P1与P3之间的通信机制为“RMI”,P3与P4之间的通信机制为“Serviceability Agent” P1与P3之间的通信机制为“RMI”,P3直接读取文件

2.4、使用总结

综合来看,使用“jinfo,jmap,jstack”命令时,采用“本地模式-实时模式”就好,没有必要采用“联网模式”,原因主要有两点:1)如果采用,增加复杂性;2)执行“jinfo/jmap/jstack”命令运行的JVM进程不是GUI进程,因此根本没有必要以“执行‘jsadebugd’命令运行的JVM进程”作为代理者。一般也没有必要采用“离线模式”,原因见“三、离线模式”。

三、离线模式

离线模式:首先需获取进程的Core Dump File,可执行gcore PID命令获得;接着需要获取借以获得上述Core Dump File的可执行文件路径,注意并不是“gcore”命令对应的可执行文件路径,可通过gdb --core=core.2162(假设“core.2126”为获取到的Core Dump File的文件名)命令进行获取,比如如下内容显示借以获得相应Core Dump File的命令为“java”,进而可获取对应的可执行文件路径。

1
Core was generated by `java -Dtoolbox.wordsegment.lib=../lib -Djava.io.tmpdir=/dev/shm -server -Xmx1204'.

接下来,介绍使用离线模式的优缺点。
1、优点
1)一旦Core Dump File得以生成,“jinfo,jmap,jstack”命令便可通过该Core Dump File多次获取需要的统计和监控信息,避免在统计和监控过程中,多次干扰目标JVM进程的正常运行。
2、缺点
1)生成的Core Dump File比较大
2)增加了一个中间步骤

总的来说,一般情况下,不使用“离线模式”,除非为保留现场环境已经生成了Core Dump File。


参考文献: [1]http://openjdk.java.net/groups/serviceability/svcjdk.html [2]http://openjdk.java.net/groups/serviceability/svcjdk.html#bjstatd [3]http://openjdk.java.net/groups/hotspot/docs/Serviceability.html [4]http://velocity.oreilly.com.cn/2013/ppts/java_web_serviceability_agent.pdf [5]http://jagadesh4java.blogspot.hk/2013/10/playing-with-core-files.html
您的支持将鼓励我继续分享!