常见的Java故障排除-jcmd
jcmd
实用工具用于向JVM发送诊断命令请求,这些请求主要用于控制 Java Flight Recordings,诊断和排除JVM和JAVA应用程序故障。该命令必须在JVM运行的机器上使用,同时必须是和启动JVM拥有相同权限的用户和用户组。
更具体的jcmd
语句和用法可以查看jcmd
command man page。
该命令jcmd <process id/main class> PerfCounter.print
会将程序中所有的性能计数打印出来。
jcmd <process id/main class> <command> [options]
会向JVM发送实际的命令。
以下的例子是如何用jcmd
向JVM发送诊断命令:
上面这张图没有截全,感兴趣的可以自己操作下。
Useful Commands for jcmd Utility
不同版本的HotSpot VM,可用的诊断命令可能也会不同。因此,查看可用选项的最好方式是使用 jcmd <process id/main class> help
命令。以下一些命令是在Java8中比较常用的命令。如果你想获取这些命令的额外选项可以使用 jcmd <process id/main class> help <command>
。
-
Print full HotSpot and JDK version ID
jcmd <process id/main class> VM.version
-
Print all the system properties set for a VM
可能会有几百行信息被展示。
jcmd <process id/main class> VM.system_properties
-
Print all the flags used for a VM
即使你没有提供任何开关,一些默认的值也会被打印出来,例如初始化的堆大小和最大的堆大小。
jcmd <process id/main class> VM.flags
-
Print the uptime in seconds
jcmd <process id/main class> VM.uptime
-
Create a class histogram
结果会在控制台打印出来,所以你也可以将其重定向到文件中。输出列表中既包含了应用程序编写的类也包含了Java的内部类。占用内存最多的类会被罗列在最上方,按占用内存大小降序排序。
jcmd <process id/main class> GC.class_histogram
-
Create a heap dump (hprof dump)
jcmd GC.heap_dump <filename>
该用法与jmap -dump:file=<file> <pid>
相同,不过jcmd
是推荐的使用工具。 -
Create a heap histogram
jcmd <process id/main class> Thread.print