The jcmd Command

名称

jcmd - 向正在运行的Java虚拟机(JVM)发送诊断命令请求

概要

jcmd [pid | main-class] command... | PerfCounter.print | -f filename

jcmd [-l]

jcmd -h

pid
当使用时,jcmd 实用程序将诊断命令请求发送到Java进程的进程ID。
main-class
当使用时,jcmd 实用程序将诊断命令请求发送到具有指定主类名称的所有Java进程。
command
command 必须是所选JVM的有效jcmd命令。通过运行help命令(jcmd pid help)获取jcmd的可用命令列表,其中pid是正在运行的Java进程的进程ID。如果pid0,则命令将发送到所有Java进程。主类参数将用于部分或完全匹配用于启动Java的类。如果没有给出选项,则列出了正在运行的Java进程标识符以及用于启动进程的主类和命令行参数(与使用-l相同)。
Perfcounter.print
打印指定Java进程公开的性能计数器。
-f filename
从指定文件filename读取并执行命令。
-l

显示未在单独的docker进程中运行的Java虚拟机进程标识符列表,以及用于启动进程的主类和命令行参数。如果JVM在docker进程中,则必须使用诸如ps之类的工具查找PID。

注意:

使用无参数的jcmd与使用jcmd -l相同。

-h
显示jcmd实用程序的命令行帮助。

描述

jcmd实用程序用于向JVM发送诊断命令请求。必须在运行JVM的同一台机器上使用,并且必须具有启动JVM时使用的相同有效用户和组标识符。每个诊断命令都有自己的一组参数。要显示诊断命令的描述、语法和可用参数列表,请使用命令名称作为参数。例如:

jcmd pid help command

如果参数包含空格,则必须用单引号或双引号('")括起来。此外,必须使用反斜杠(\)转义单引号或双引号,以防止操作系统shell处理引号。或者,您可以用单引号括起这些参数,然后用双引号括起(或用双引号括起,然后用单引号括起)这些参数。

如果将进程标识符(pid)或主类(main-class)指定为第一个参数,则jcmd实用程序将诊断命令请求发送到具有指定标识符的Java进程或具有指定主类名称的所有Java进程。还可以通过将0指定为进程标识符,将诊断命令请求发送到所有可用的Java进程。

jcmd的命令

command必须是所选JVM的有效jcmd诊断命令。通过运行help命令(jcmd pid help)获取jcmd的可用命令列表,其中pid是正在运行的Java进程的进程ID。如果pid0,则命令将发送到所有Java进程。主类参数将用于部分或完全匹配用于启动Java的类。如果没有给出选项,则列出了正在运行的Java进程标识符,这些进程不在单独的docker进程中,以及用于启动进程的主类和命令行参数(与使用-l相同)。

以下命令可用:

帮助 [选项] [参数]

获取有关特定命令的更多信息。

参数

  • 命令名称:我们想要帮助的命令的名称(STRING,无默认值)

注意:

以下选项必须使用keykey=value语法指定。

选项

  • -all:(可选)显示所有命令的帮助(BOOLEAN,false)。
编译器.codecache

打印代码缓存布局和边界。

影响:低

编译器.codelist

打印代码缓存中所有存活的已编译方法。

影响:中等

编译器.perfmap(仅限Linux)

为Linux perf工具编写映射文件。

影响:低

编译器.queue

打印排队等待编译的方法。

影响:低

编译器.directives_add *filename* *arguments*

从文件中添加编译器指令。

影响:低

参数

文件名:指令文件的名称(STRING,无默认值)

编译器.directives_clear

删除所有编译器指令。

影响:低

编译器.directives_print

打印所有活动的编译器指令。

影响:低

编译器.directives_remove

删除最近添加的编译器指令。

影响:低

GC.class_histogram [选项]

提供有关Java堆使用情况的统计信息。

影响:高 --- 取决于Java堆大小和内容。

注意:

必须使用keykey=value语法指定选项

选项

  • -all:(可选)检查所有对象,包括不可达对象(BOOLEAN,false)
  • -parallel:(可选)用于堆检查的并行线程数。 0(默认值)表示让VM确定要使用的线程数。 1表示使用一个线程(禁用并行性)。 对于任何其他值,VM将尝试使用指定数量的线程,但可能使用较少的线程。 (INT,0)
GC.finalizer_info

提供有关Java终结器队列的信息。

影响:中等

GC.heap_dump [选项] [参数]

生成Java堆的HPROF格式转储。

影响:高 --- 取决于Java堆大小和内容。 除非指定-all选项,否则请求完整GC。

注意:

必须使用keykey=value语法指定以下选项

选项

  • -all:(可选)转储所有对象,包括不可达对象(BOOLEAN,false)
  • -gz:(可选)如果指定,则使用给定的压缩级别以gzipped格式编写堆转储。 1(推荐)是最快的,9是最强的压缩。 (INT,1)
  • -overwrite:(可选)如果指定,如果存在转储文件,将覆盖该文件(BOOLEAN,false)

参数

  • 文件名:转储文件的名称(STRING,无默认值)
GC.heap_info

提供通用的Java堆信息。

影响:中等

GC.run

调用java.lang.System.gc()

影响:中等 --- 取决于Java堆大小和内容。

GC.run_finalization

调用java.lang.System.runFinalization()

影响:中等 --- 取决于Java内容。

JFR.check [选项]

显示有关正在运行的飞行记录的信息

影响:低

注意:

必须使用keykey=value语法指定选项。 如果未输入任何参数,则显示所有活动记录的信息。

选项

  • name:(可选)飞行记录的名称。 (STRING,无默认值)

  • verbose:(可选)用于打印记录的事件设置的标志(BOOLEAN,false)

JFR.configure [选项]

设置飞行记录的参数

影响:低

注意:

必须使用keykey=value语法指定选项。 如果未输入任何参数,则显示当前设置。

选项

  • globalbuffercount:(可选)全局缓冲区的数量。 此选项是一个旧选项:更改memorysize参数以更改全局缓冲区的数量。 一旦初始化了JFR,就无法更改此值。 (STRING,默认值由memorysize的值确定)

  • globalbuffersize:(可选)全局缓冲区的大小,以字节为单位。 此选项是一个旧选项:更改memorysize参数以更改全局缓冲区的大小。 一旦初始化了JFR,就无法更改此值。 (STRING,默认值由memorysize的值确定)

  • maxchunksize:(可选)如果未使用以下后缀之一:'m'或'M'表示兆字节,'g'或'G'表示千兆字节,则单个数据块的最大大小,以字节为单位。 一旦初始化了JFR,就无法更改此值。 (STRING,12M)

  • memorysize:(可选)总内存大小,以字节为单位,如果未使用以下后缀之一:'m'或'M'表示兆字节,'g'或'G'表示千兆字节。 一旦初始化了JFR,就无法更改此值。 (STRING,10M)

  • repositorypath:(可选)存储记录直到写入永久文件的位置的路径。 (STRING,默认位置是操作系统的临时目录。 在Linux操作系统上,临时目录是/tmp。 在Windows上,临时目录由TMP环境变量指定。)

  • preserve-repository={true|false}:指定在JVM退出后是否应保留磁盘存储库中的文件。 如果为false,则文件将被删除。 默认情况下,此参数已禁用。

  • stackdepth:(可选)堆栈跟踪的堆栈深度。 将此值设置为大于默认值64可能会导致性能下降。 一旦初始化了JFR,就无法更改此值。 (LONG,64)

  • thread_buffer_size:(可选)每个线程的本地缓冲区大小,如果未使用以下后缀之一:'k'或'K'表示千字节,'m'或'M'表示兆字节。 覆盖此参数可能会降低性能,不建议使用。 一旦初始化了JFR,就无法更改此值。 (STRING,8k)

  • samplethreads:(可选)激活线程采样的标志。 (BOOLEAN,true)

JFR.dump [选项]

在运行飞行记录时将数据写入文件

影响:低

注意:

必须使用keykey=value语法指定选项。 不需要任何选项。 写入数据后,记录将继续运行。

选项

  • begin:(可选)指定将包含在转储文件中的记录数据的起始时间。 格式指定为本地时间。 (STRING,无默认值)

  • end:(可选)指定将包含在转储文件中的记录数据的结束时间。 格式指定为本地时间。 (STRING,无默认值)

    注意:对于beginend,时间必须采用java.time.LocalTime::parse(STRING)、java.time.LocalDateTime::parse(STRING)或java.time.Instant::parse(STRING)可读取的格式。 例如,“13:20:15”,“2020-03-17T09:00:00”或“2020-03-17T09:00:00Z”。

    注意: beginend时间对应于飞行记录数据中找到的时间戳。

    另一个选项是使用相对于当前时间的时间,由负整数后跟“s”、“m”或“h”指定。 例如,“-12h”,“-15m”或“-30s”

  • filename:(可选)将飞行记录数据转储到的文件的名称。 如果未提供文件名,则从PID和当前日期生成文件名。 文件名也可以是一个目录,在这种情况下,文件名将从PID和指定目录中的当前日期生成。 如果文件名中指定了%p和/或%t,则它会扩展为JVM的PID和当前时间戳。 (STRING,无默认值)

  • maxage:(可选)将飞行记录数据转储到文件的时间长度。 (整数后跟's'表示秒,'m'表示分钟或'h'表示小时,无默认值)

  • maxsize:(可选)从飞行记录中转储的数据量的最大大小,如果未使用以下后缀之一:'m'或'M'表示兆字节,'g'或'G'表示千兆字节。 (STRING,无默认值)

  • name:(可选)记录的名称。 如果未提供名称,则转储所有记录的数据。 (STRING,无默认值)

  • path-to-gc-root:(可选)保存在转储记录数据时垃圾收集(GC)根路径的标志。 路径信息对于查找内存泄漏很有用,但收集它可能会导致应用程序暂停一小段时间。 仅在怀疑应用程序存在内存泄漏时才打开此标志。 (BOOLEAN,false)

JFR.start [选项]

开始飞行记录

影响:低

注意:

必须使用keykey=value语法指定options。如果未输入任何参数,则使用默认值开始记录。

options

  • delay:(可选)开始记录前等待的时间长度(整数后跟's'表示秒,'m'表示分钟或'h'表示小时,0s)

  • disk:(可选)在记录时同时将数据写入磁盘的标志(布尔值,true)

  • dumponexit:(可选)在Java虚拟机(JVM)关闭时将记录写入磁盘的标志。如果设置为'true'并且未为filename指定值,则记录将写入启动进程所在目录中的文件。文件名是一个系统生成的名称,包含进程ID、记录ID和当前时间戳。 (例如:id-1-2019_12_12_10_41.jfr)(布尔值,false)

  • duration:(可选)记录的时间长度。请注意,0s表示永久(整数后跟's'表示秒,'m'表示分钟或'h'表示小时,0s)

  • filename:(可选)停止记录时写入飞行记录数据的文件名。如果未提供文件名,则从PID和当前日期生成文件名,并放置在启动进程所在的目录中。文件名也可以是一个目录,此时文件名将从PID和指定目录中的当前日期生成。如果文件名中指定了%p和/或%t,则会扩展为JVM的PID和当前时间戳。 (字符串,无默认值)

  • maxage:(可选)在磁盘上保留记录数据的最长时间。仅当disk参数设置为true时,此参数有效。注意0s表示永久。 (整数后跟's'表示秒,'m'表示分钟或'h'表示小时,0s)

  • maxsize:(可选)在磁盘上保留的数据的最大大小(以字节为单位),如果未使用以下后缀之一:'m'或'M'表示兆字节,或'g'或'G'表示千兆字节。仅当disk参数设置为'true'时,此参数有效。该值不得小于使用JFR.configure命令设置的maxchunksize参数的值。 (字符串,0(无最大大小))

  • name:(可选)记录的名称。如果未提供名称,则会生成一个名称。请注意,在响应命令中显示的生成名称,以便您可以在其他命令中使用它。 (字符串,系统生成的默认名称)

  • path-to-gc-root:(可选)保存记录结束时垃圾收集(GC)根路径的标志。路径信息对于查找内存泄漏很有用,但收集它需要时间。仅在怀疑应用程序存在内存泄漏时才打开此标志。如果settings参数设置为'profile',则收集的信息包括从分配潜在泄漏对象的堆栈跟踪。 (布尔值,false)

  • settings:(可选)标识要记录哪些事件的设置文件的名称。要指定多个文件,请使用逗号(',')分隔名称。如果文件不在JAVA-HOME/lib/jfr中,则包含路径。以下配置文件包含在JDK的JAVA-HOME/lib/jfr目录中:'default.jfc':使用低开销收集预定义信息,因此对性能影响很小,并且可用于连续运行的记录;'profile.jfc':提供比'default.jfc'配置文件更多的数据,但对性能有更大影响。当需要更多信息时,可以短时间使用此配置。使用none启动没有预定义配置文件的记录。 (字符串,JAVA-HOME/lib/jfr/default.jfc)

事件设置和.jfc选项可以使用以下语法指定:

  • option:(可选)指定要修改的选项值。要列出可用选项,请使用JAVA_HOME/bin/jfr工具。

  • event-setting:(可选)指定要修改的事件设置值。使用形式:<event-name>#<setting-name>=<value>要添加新的事件设置,请使用'+'前缀事件名称。

可以通过使用空格分隔符为多个事件设置和.jfc选项指定值。在参数和.jfc选项之间存在冲突时,参数将优先。对于时间跨度值,即20ms,可以省略空格分隔符。有关设置语法的更多信息,请参阅jdk.jfr包的Javadoc。

JFR.stop [options]

停止飞行记录

影响:低

注意:

必须使用keykey=value语法指定options。如果未输入任何参数,则不会停止任何记录。

options

  • filename:(可选)停止记录时写入记录的文件名。如果文件名中指定了%p和/或%t,则会扩展为JVM的PID和当前时间戳。如果未提供路径,则来自记录的数据将被丢弃。 (字符串,无默认值)

  • name:(可选)记录的名称(字符串,无默认值)

JVMTI.agent_load [arguments]

加载JVMTI本机代理。

影响:低

arguments

  • library path:要加载的JVMTI代理的绝对路径。 (字符串,无默认值)

  • agent option:(可选)传递代理的选项字符串。 (字符串,无默认值)

JVMTI.data_dump

发出JVM进行JVMTI数据转储请求。

影响:高

ManagementAgent.start [options]

启动远程管理代理。

影响:低 --- 无影响

注意:

必须使用keykey=value语法指定以下options

options

  • config.file:(可选)设置com.sun.management.config.file(字符串,无默认值)

  • jmxremote.host:(可选)设置com.sun.management.jmxremote.host(字符串,无默认值)

  • jmxremote.port:(可选)设置com.sun.management.jmxremote.port(字符串,无默认值)

  • jmxremote.rmi.port:(可选)设置com.sun.management.jmxremote.rmi.port(字符串,无默认值)

  • jmxremote.ssl:(可选)设置com.sun.management.jmxremote.ssl(字符串,无默认值)

  • jmxremote.registry.ssl:(可选)设置com.sun.management.jmxremote.registry.ssl(字符串,无默认值)

  • jmxremote.authenticate:(可选)设置com.sun.management.jmxremote.authenticate(字符串,无默认值)

  • jmxremote.password.file:(可选)设置com.sun.management.jmxremote.password.file(字符串,无默认值)

  • jmxremote.access.file:(可选)设置com.sun.management.jmxremote.acce ss.file(字符串,无默认值)

  • jmxremote.login.config:(可选)设置com.sun.management.jmxremote.log in.config(字符串,无默认值)

  • jmxremote.ssl.enabled.cipher.suites:(可选)设置com.sun.management

  • jmxremote.ssl.enabled.cipher.suite:(字符串,无默认值)

  • jmxremote.ssl.enabled.protocols:(可选)设置com.sun.management.jmxr emote.ssl.enabled.protocols(字符串,无默认值)

  • jmxremote.ssl.need.client.auth:(可选)设置com.sun.management.jmxre mote.need.client.auth(字符串,无默认值)

  • jmxremote.ssl.config.file:(可选)设置com.sun.management.jmxremote. ssl_config_file(字符串,无默认值)

  • jmxremote.autodiscovery:(可选)设置com.sun.management.jmxremote.au todiscovery(字符串,无默认值)

  • jdp.port:(可选)设置com.sun.management.jdp.port(整数,无默认值)

  • jdp.address:(可选)设置com.sun.management.jdp.address(字符串,无默认值)

  • jdp.source_addr:(可选)设置com.sun.management.jdp.source_addr(字符串,无默认值)

  • jdp.ttl:(可选)设置com.sun.management.jdp.ttl(整数,无默认值)

  • jdp.pause:(可选)设置com.sun.management.jdp.pause(整数,无默认值)

  • jdp.name:(可选)设置com.sun.management.jdp.name(字符串,无默认值)

ManagementAgent.start_local

启动本地管理代理。

影响:低 --- 无影响

ManagementAgent.status

打印管理代理状态。

影响:低 --- 无影响

ManagementAgent.stop

停止远程管理代理。

影响:低 --- 无影响

System.native_heap_info(仅限Linux)

通过malloc_info(3)打印有关本机堆使用情况的信息。

影响:低

System.trim_native_heap(仅限Linux)

尝试通过修剪C堆来释放内存。

影响:低

Thread.print [options]

打印所有带有堆栈跟踪的线程。

影响:中等 --- 取决于线程数量。

注意:

必须使用keykey=value语法指定以下options

options

  • -e:(可选)打印扩展线程信息(布尔值,false)
  • -l:(可选)打印java.util.concurrent锁(布尔值,false)
VM.cds [arguments]

转储包含当前加载的所有类的静态或动态共享存档。

影响:中等 --- 暂停时间取决于加载的类数量

参数

  • subcmd:必须是static_dumpdynamic_dump(STRING,无默认值)
  • filename:(可选)要转储的共享存档的名称(STRING,无默认值)

如果未指定filename,将使用目标JVM进程的pid选择默认文件名。例如,java_pid1234_static.jsa,java_pid5678_dynamic.jsa等。

如果未指定filename作为绝对路径,则存档文件将在相对于目标JVM进程的当前目录的目录中创建。

如果指定了dynamic_dump,则目标JVM必须使用JVM选项-XX:+RecordDynamicDumpInfo启动。

VM.classloaders [选项]

打印类加载器层次结构。

影响:中等 --- 取决于类加载器和加载的类数量。

必须使用以下选项,使用keykey=value语法指定。

选项

  • show-classes:(可选)打印已加载的类(BOOLEAN,false)
  • verbose:(可选)打印详细信息(BOOLEAN,false)
  • fold:(可选)将具有相同名称和类的加载器显示为一个(BOOLEAN,true)
VM.classloader_stats

打印有关所有类加载器的统计信息。

影响:低

VM.class_hierarchy [选项] [参数]

打印所有已加载类的列表,缩进显示类层次结构。每个类的名称后面跟着其ClassLoaderData*,如果由引导类加载器加载,则为“null”。

影响:中等 --- 取决于加载的类数量。

注意:

必须使用以下选项,使用keykey=value语法指定。

选项

  • -i:(可选)应打印继承的接口(BOOLEAN,false)

  • -s:(可选)如果指定了类名,则除了其超类外,还打印其子类。如果没有此选项,将仅打印超类(BOOLEAN,false)

参数

  • classname:(可选)应打印其层次结构的类的名称。如果未指定,则打印所有类层次结构(STRING,无默认值)
VM.command_line

打印用于启动此VM实例的命令行。

影响:低

VM.dynlibs

打印加载的动态库。

影响:低

VM.events [选项]

打印VM事件日志

影响:低 --- 取决于事件日志大小。

选项

注意:

必须使用以下选项,使用keykey=value语法指定。

  • log:(可选)要打印的日志名称。如果省略,将打印所有日志(STRING,无默认值)
  • max:(可选)要打印的事件的最大数量(最新的在前)。如果省略,将打印所有事件(STRING,无默认值)
VM.info

打印有关JVM环境和状态的信息。

影响:低

VM.log [选项]

列出当前的日志配置,启用/禁用/配置日志输出,或旋转所有日志。

影响:低

选项

注意:

必须使用以下选项,使用keykey=value语法指定。

  • output:(可选)要配置的输出的名称或索引(#)(STRING,无默认值)

  • output_options:(可选)输出的选项(STRING,无默认值)

  • what:(可选)配置要记录的标记(STRING,无默认值)

  • decorators:(可选)配置要使用的装饰器。使用'none'或空值删除所有装饰器(STRING,无默认值)

  • disable:(可选)关闭所有日志记录并清除日志配置(BOOLEAN,无默认值)

  • list:(可选)列出当前的日志配置(BOOLEAN,无默认值)

  • rotate:(可选)旋转所有日志(BOOLEAN,无默认值)

VM.flags [选项]

打印VM标志选项及其当前值。

影响:低

注意:

必须使用以下选项,使用keykey=value语法指定。

选项

  • -all:(可选)打印VM支持的所有标志(BOOLEAN,false)。
VM.metaspace [选项]

打印元空间的统计信息

影响:中等 --- 取决于加载的类数量。

注意:

必须使用以下选项,使用keykey=value语法指定。

选项

  • basic:(可选)打印基本摘要(不需要安全点)。 (BOOLEAN,false)
  • show-loaders:(可选)按类加载器显示使用情况。 (BOOLEAN,false)
  • show-classes:(可选)如果设置了show-loaders,则显示每个加载器的加载类。 (BOOLEAN,false)
  • by-chunktype:(可选)按块类型拆分数字。 (BOOLEAN,false)
  • by-spacetype:(可选)按加载器类型拆分数字。 (BOOLEAN,false)
  • vslist:(可选)显示有关底层虚拟空间的详细信息。 (BOOLEAN,false)
  • scale:(可选)要缩放的内存使用情况。有效值为:1、KB、MB或GB(固定比例),或“dynamic”以动态选择比例。 (STRING,dynamic)
VM.native_memory [选项]

打印本机内存使用情况

影响:中等

注意:

必须使用以下选项,使用keykey=value语法指定。

选项

  • summary:(可选)请求运行时报告当前内存摘要,其中包括总保留和已提交内存,以及每个子系统的内存使用摘要。 (BOOLEAN,false)

  • detail:(可选)请求运行时报告每个调用点的内存分配≥1K。 (BOOLEAN,false)

  • baseline:(可选)请求运行时基线当前内存使用情况,以便以后进行比较。 (BOOLEAN,false)

  • summary.diff:(可选)请求运行时报告与先前基线的内存摘要比较。 (BOOLEAN,false)

  • detail.diff:(可选)请求运行时报告与先前基线的内存详细比较,显示不同调用点的内存分配活动。 (BOOLEAN,false)

  • statistics:(可选)打印用于调整目的的跟踪器统计信息。 (BOOLEAN,false)

  • scale:(可选)内存使用情况,KB、MB或GB(STRING,KB)

VM.print_touched_methods

打印在此JVM生命周期中曾经被访问过的所有方法。

影响:中等 --- 取决于Java内容。

VM.set_flag [参数]

使用提供的值设置VM标志选项。

影响:低

参数

  • flag name:要设置的标志的名称(STRING,无默认值)

  • string value:(可选)要设置的值(STRING,无默认值)

VM.stringtable [选项]

转储字符串表。

影响:中等 --- 取决于Java内容。

注意:

必须使用以下选项,使用keykey=value语法指定。

选项

  • -verbose:(可选)转储表中每个字符串的内容(BOOLEAN,false)
VM.symboltable [选项]

转储符号表。

影响:中等 --- 取决于Java内容。

注意:

必须使用以下选项,使用keykey=value语法)指定。

选项

  • -verbose:(可选)转储表中每个符号的内容(BOOLEAN,false)
VM.systemdictionary

打印字典哈希表大小和桶长度的统计信息。

影响:中等

注意:

必须使用以下选项,使用keykey=value语法指定。

选项

  • verbose:(可选)为所有类加载器转储每个字典条目的内容(BOOLEAN,false)。
VM.system_properties

打印系统属性。

影响:低

VM.uptime [选项]

打印VM的正常运行时间。

影响:低

注意:

必须使用以下选项,使用keykey=value语法指定。

选项

  • -date:(可选)添加当前日期的前缀(BOOLEAN,false)
VM.version

打印JVM版本信息。

影响:低