jcmd 命令
我在过去的几篇文章中都引用了方便的JDK工具jcmd ,但是像我以前对jps所做的那样,只专注于它的实用性 。 jcmd工具是随Oracle Java 7引入的,通过使用它来识别Java进程的ID (与jps相似),获取堆转储 (与jmap相似),获取线程转储 (与jstack相似),在解决 JVM应用程序 问题方面特别有用。 ),查看虚拟机特征(例如系统属性和命令行标志)(类似于jinfo ),并获取垃圾回收统计信息(类似于jstat )。 jcmd工具被称为“ 用于调查和解决JVM应用程序问题的瑞士军刀 ”和“ 隐藏的宝石” 。
在使用大多数JDK命令行工具(包括jcmd
)时,标识要为其使用命令行工具的Java进程的进程ID(pid)通常很重要。 使用jcmd
可以轻松完成此jcmd
,只需简单地运行不带任何参数的命令即可,如下面的屏幕快照所示。
在上面的示例中运行不带参数的jcmd
显示了两个正在运行的Java进程( jcmd
自身的pid为324,另一个Java进程的pid为7268)。 请注意,尽管在列出Java进程时jcmd
工作原理与jps
非常相似,但与不带参数-lm
jps
相比, jcmd
列出的信息更多。
运行jcmd -h
用于显示帮助和用法信息jcmd
在下一屏幕快照证明。
如刚刚所示,该帮助说明jcmd
在“未给出任何选项”时“列出Java进程”。 帮助还指出,这是类似于运行行为jcmd -p
,但我认为它的意思是说运行jcmd
不带选项相当于跑步jcmd -l
,这是在接下来的屏幕快照所示。
就像在不带任何选项的情况下运行jcmd
, jcmd -l
列出了Java进程及其各自的pid。 本例中的pids不同,因为它是jcmd
的不同执行, jcmd
我运行的Java进程也不同。
运行jcmd -h
显示相对较少的选项。 要查看jcmd
支持的许多功能的帮助,需要询问jcmd
特定Java进程支持哪些功能。 下一个屏幕快照对此进行了说明。 我首先运行不带选项的jcmd
来发现感兴趣的Java进程的pid(在本例中为6320)。 然后,我可以运行jcmd 6320 help
来查看jcmd
支持哪些命令。
上一个屏幕快照展示了jcmd
支持pid标识的特定Java VM的命令。 具体来说,它指出“以下命令可用:”,然后列出它们:
- JFR停止
- 启动JFR
- JFR转储
- JFR。检查
- VM.native_memory
- VM.check_commercial_features
- VM.unlock_commercial_features
- 管理代理停止
- ManagementAgent.start_local
- ManagementAgent.start
- GC.rotate_log
- GC.class_stats
- GC.class_histogram
- GC.heap_dump
- GC.run_finalization
- GC运行
- 线程打印
- 虚拟机正常运行时间
- 虚拟机标志
- VM.system_properties
- VM.command_line
- 虚拟机版本
- 救命
当针对另一个Java VM进程的pid运行jcmd <pid> help
,可能会获得不同的可用命令列表。 下一个屏幕快照说明了这一点,当针对该进程的pid为1216执行jcmd 1216 help
时。
通过比较最后两个屏幕快照,可以清楚地看出jcmd
支持针对不同Java VM实例的不同命令。 这就是为什么通过在help
命令中指定pid列出特定VM支持的命令的原因。 未针对原始检查的VM列出的第二个VM可用的一些命令(在本例中为pid 1216)包括以下命令:
- VM.log
- 管理代理状态
- Compiler.directives_clear
- Compiler.directives_remove
- Compiler.directives_add
- Compiler.directives_print
- VM.print_touched_methods
- 编译器
- 编译器代码清单
- 编译器队列
- VM.classloader_stats
- JVMTI.data_dump
- VM.stringtable
- 虚拟机
- VM.class_hierarchy
- GC.finalizer_info
- GC.heap_info
- VM.info
- VM.dynlibs
- VM.set_flag
此“帮助”还建议:“有关特定命令的更多信息,请使用'help <command>'。” 下一个屏幕快照专门针对jcmd
的Thread.print
说明了如何执行此Thread.print
在讨论jcmd
Thread.print
命令的主题时,是一个很好的时机来说明如何使用它来查看Java进程的线程堆栈。 下一个屏幕快照显示了执行jcmd <pid> Thread.print
(在本例中为pid 6320的Java进程)时看到的冗长结果的开始。
jcmd
支持多个VM.*
命令: VM.version
, VM.uptime
, VM.command_line
, VM.flags
, VM.system_properties
, VM.native_memory
和VM.classloader_stats
。 下一个屏幕快照说明了对使用pid 6320的Java进程使用jcmd <pid> VM.version
和jcmd <pid> VM.uptime
的情况。
下一个屏幕快照演示了jcmd <pid> VM.command_line
使用pid 6320来执行jcmd <pid> VM.command_line
。
从该屏幕快照(其中显示了运行jcmd 6320 VM.command_line
的输出的顶部)中,我们可以从为此过程提供的JVM命令行参数中看到它是与NetBeans相关的过程。 使用pid 6320对Java进程运行命令jcmd <pid> VM.flags
显示传递给该进程的HotSpot选项。
可以使用jcmd <pid> VM.system_properties
列出Java进程使用的系统属性,这将在下一个屏幕快照中进行说明。
当尝试对尚未启用本机内存跟踪 (NMT)的Java进程运行jcmd <pid> VM.native_memory
,将显示错误消息“未启用本机内存跟踪”,如下一个屏幕快照所示。
要使用命令jcmd <pid> VM.native_memory
,应使用-XX:NativeMemoryTracking=summary
或-XX:NativeMemoryTracking=detail
选项启动要测量的JVM(Java进程)。 使用这些选项之一启动VM后,可以针对该JVM进程执行命令jcmd <pid> VM.native_memory baseline
,然后执行jcmd <pid> VM.native_memory detail.diff
。
jcmd <pid> VM.classloader_stats
命令可提供对类加载器的了解。 下一个针对pid为1216的Java进程的屏幕快照中显示了该快照:
jcmd <pid> VM.class_hierarchy
是一个有趣的命令,可显示在目标Java VM进程中加载的类的层次结构。
jcmd <pid> VM.dynlibs
可用于查看动态库信息。 在下一个屏幕快照中对此进行了演示,该快照是使用pid 1216针对Java进程执行的。
jcmd <pid> VM.info
列出了许多有关目标Java VM进程的信息,包括VM摘要以及有关该进程,垃圾回收事件,动态库,提供给VM的参数以及主机某些特征的信息。机。 在jcmd 1216 VM.info
的下一个屏幕快照中演示了此输出开始的一小部分:
下一个屏幕快照展示了jcmd <pid> VM.stringtable
和jcmd <pid> VM.symboltable
:
下一个屏幕快照中演示了jcmd <pid> Compiler.directives_print
使用。
jcmd
支持的几个命令支持管理和监视垃圾收集。 其中两个是jcmd <pid> GC.run
[类似于System.gc() ]和jcmd <pid> GC.run_finalization
[类似于System.runFinalization() ]。 在下一个屏幕快照中将演示其中两个。
命令jcmd <pid> GC.class_histogram
提供了一种方便的方法来查看对象直方图 ,如下一个屏幕快照所示。
jcmd
可用于使用jcmd <pid> GC.heap_dump <filename>
针对正在运行的Java VM生jcmd <pid> GC.heap_dump <filename>
转储,这将在下一个屏幕快照中进行演示。
现在,可以使用jhat命令来处理jcmd
生成的堆转储,如以下两个屏幕快照所示。
有些jcmd
命令仅适用于使用-XX:+UnlockDiagnosticVMOptions
JVM标志启动的Java VM。 下一个屏幕快照演示了当我尝试对未以标志-XX:+UnlockDiagnosticVMOptions
jcmd <pid> GC.class_stats
的Java VM运行jcmd <pid> GC.class_stats
时发生的情况。
使用-XX:+UnlockDiagnosticVMOptions
启动目标VM时, jcmd <pid> GC.class_stats
显示“ 有关Java类元数据的统计信息 ”。
这篇文章介绍了jcmd
提供的一些命令,但没有涉及与Java Flight Recorder [ JFR ](名称以JFR.*
开头的命令)相关的功能,以检查和启用商业功能( jcmd <pid> VM.check_commercial_features
和jcmd <pid> VM.unlock_commercial_features
)。
在一个命令行工具中, jcmd汇集了几个命令行JDK工具的功能。 这篇文章演示了jcmd
提供的一些功能。
翻译自: https://www.javacodegeeks.com/2016/03/jcmd-one-jdk-command-line-tool-rule.html
jcmd 命令