jcmd功能被用来发送诊断命令请求道JVM,这些请求对控制Java飞行记录、问题定位、JVM诊断和Java应用很有用,它必须用在JVM运行的同一台机器上面,具有相同高效的用来启动JVM的用户和组标识。
无选项的jcmd命令列举所有本地运行的JVM,包括进程ID和main类的名字。
jcmd -l命令打印所有运行中的用main类和启动命令行参数标识的java进程。
jcmd -h打印使用帮助。
jcmd <pid/main class> help 列举了对指定进程可用的所有诊断命令。
jcmd <pid/main class> PerfCounter.print 打印进程中的所有性能计数器。
jcmd <pid/main class> <command> <options>发送实际的命令到JVM。
对jcmd功能有用的命令
可用的诊断命令可能随着HotSpot VM版本的不同而不同,使用jcmd <pid/main class> help是查看所有可用选项最好的方式。下面是一些JDK8引入的最有用的命令中的一部分,要记住你总是可以使用jcmd <pid/main class> help <command>获取这些命令的任何额外的选项。
- 打印完整的HotSpot和JDK版本ID:jcmd <pid/main class> VM.version
- 打印完整的VM系统属性集:jcmd <pid/main class> VM.system+properties
- 打印VM使用的所有标志:jcmd <pid/main class> VM.flags
- 打印启动时间(秒):jcmd <pid/main class> VM.uptime
- 创建类柱状图:jcmd <pid/main class> GC.class_histogram
- 创建堆柱状图:jcmd <pid/main class> GC.class_histogram filaname=Myheaphistogram,这条命令和jmap -histo <pid>类似,但用推荐这条命令
- 打印所有线程堆栈:jcmd <pid/main class> Thread.print
jcmd功能的问题定位选项
jcmd功能提供一下问题定位选项:
- 启动一个记录。例如,在一个以7060标识的运行中的Java进程中启动一个2分钟的记录并保存到当前目录的myrecording.jfr文件中:jcmd 7060 JFR.start name=MyRecording settings=profile delay=20s duration=2m filename=myrecording.jfr
- 检查一个记录。JFR.check诊断命令检查一个运行中的记录:jcmd 7060 JFR.check
- 停止一个记录。jcmd 7060 JFR.stop
- dump一个记录。jcmd 7060 JFR.dump name=MyRecording filaneme=myrecording.jfr
- 创建一个堆dump。jcmd <pid> GC.heap.dump filename=Myheapdump
- 创建一个堆柱状图。jcmd <pid> GC.class_histogram filename=Myheaphistogram