当前教程
Jcmd - 向 JVM 发送诊断命令
系列中的下一个

系列中的下一个: Jdb - 修复 Java 程序中的错误

Jcmd - 向 JVM 发送诊断命令

 

介绍 Jcmd

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 命令。jcmd 的可用命令列表可以通过运行 help 命令(jcmd pid help)获得,其中 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 诊断命令。jcmd 的可用命令列表可以通过运行 help 命令(jcmd pid help)获得,其中 pid 是正在运行的 Java 进程的进程 ID。如果 pid0,则命令将发送到所有 Java 进程。主类参数将用于部分或完全匹配用于启动 Java 的类。如果没有给出选项,它将列出正在运行的 Java 进程标识符,以及用于启动进程的主类和命令行参数(与使用 -l 相同)。

以下命令可用

help [options] [arguments]

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

arguments:

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

注意

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

options:

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

Compiler.codecache

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

影响:低

权限:java.lang.management.ManagementPermission(monitor)

Compiler.codelist

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

影响:中等

权限:java.lang.management.ManagementPermission(monitor)

Compiler.queue

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

影响:低

权限:java.lang.management.ManagementPermission(monitor)

Compiler.directives_add *filename* *arguments*

从文件添加编译器指令。

影响:低

权限:java.lang.management.ManagementPermission(monitor)

arguments:

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

Compiler.directives_clear

删除所有编译器指令。

影响:低

权限:java.lang.management.ManagementPermission(monitor)

Compiler.directives_print

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

影响:低

权限:java.lang.management.ManagementPermission(monitor)

Compiler.directives_remove

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

影响:低

权限:java.lang.management.ManagementPermission(monitor)

GC.class_histogram options

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

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

权限:java.lang.management.ManagementPermission(monitor)

注意

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

options:

  • -all: (可选)检查所有对象,包括不可达对象(BOOLEAN,false)

GC.finalizer_info

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

影响:中等

权限:java.lang.management.ManagementPermission(monitor)

GC.heap_dump options arguments

生成 Java 堆的 HPROF 格式转储。

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

权限:java.lang.management.ManagementPermission(monitor)

注意

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

options:

  • -all: (可选)转储所有对象,包括不可达对象(BOOLEAN,false)

arguments:

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

GC.heap_info

提供通用的 Java 堆信息。

影响:中等

权限:java.lang.management.ManagementPermission(monitor)

GC.run

调用 java.lang.System.gc()

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

GC.run_finalization

调用 java.lang.System.runFinalization()

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

JFR.check options

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

影响:低

注意

options 必须使用 keykey=value 语法指定。如果没有输入参数,则会显示所有活动记录的信息。

options:

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

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

JFR.configure options

设置飞行记录的参数

影响:低

注意

options 必须使用 keykey=value 语法指定。如果没有输入参数,则会显示当前设置。

options:

  • 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。在 Windwows 上,临时目录由 TMP 环境变量指定。)

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

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

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

JFR.dump options

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

影响:低

注意

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

options:

  • 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 时间对应于飞行记录数据中记录信息内的 timestamps。

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

  • filename: (可选)飞行记录数据转储到的文件的名称。如果没有给出文件名,则会从 PID 和当前日期生成文件名。文件名也可以是目录,在这种情况下,文件名将从指定目录中的 PID 和当前日期生成。(STRING,无默认值)

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

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

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

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

JFR.start options

启动飞行记录

影响:低

注意

options 必须使用 keykey=value 语法指定。如果没有输入参数,则会使用默认值启动记录。

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 和当前日期在指定目录中生成。(字符串,无默认值)

  • 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 中,请包含路径。以下配置文件包含在 JAVA-HOME/lib/jfr 目录中的 JDK 中:'default.jfc':以低开销收集一组预定义的信息,因此它对性能的影响最小,可以与持续运行的录制一起使用;'profile.jfc':提供比 'default.jfc' 配置文件更多的数据,但开销更大,对性能的影响也更大。在需要更多信息时,将此配置用于短时间段。使用 none 启动没有预定义配置文件的录制。(字符串,JAVA-HOME/lib/jfr/default.jfc)

JFR.stop options

停止飞行录制

影响:低

注意

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

options:

  • filename: (可选) 停止录制时写入录制内容的文件名。如果未提供路径,则录制中的数据将被丢弃。(字符串,无默认值)

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

JVMTI.agent_load arguments

加载 JVMTI 本机代理。

影响:低

权限:java.lang.management.ManagementPermission(control)

arguments:

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

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

JVMTI.data_dump

向 JVM 发出 JVMTI 的数据转储请求。

影响:高

权限:java.lang.management.ManagementPermission(monitor)

ManagementAgent.start options

启动远程管理代理。

影响:低 - 无影响

注意

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

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

打印管理代理状态。

影响:低 - 无影响

权限:java.lang.management.ManagementPermission(monitor)

ManagementAgent.stop

停止远程管理代理。

影响:低 - 无影响

Thread.print options

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

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

权限:java.lang.management.ManagementPermission(monitor)

注意

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

options:

  • -l: (可选) 打印 java.util.concurrent 锁(布尔值,false)

VM.classloader_stats

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

影响:低

权限:java.lang.management.ManagementPermission(monitor)

VM.class_hierarchy options arguments

打印所有已加载类的列表,缩进以显示类层次结构。每个类的名称后跟其类加载器的 ClassLoaderData*,或者如果它是通过引导类加载器加载的,则为 "null"。

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

权限:java.lang.management.ManagementPermission(monitor)

注意

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

options:

  • -i: (可选) 应打印继承的接口。(布尔值,false)

  • -s: (可选) 如果指定了类名,则打印子类。如果未指定类名,则仅打印超类。(布尔值,false)

arguments:

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

VM.command_line

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

影响:低

权限:java.lang.management.ManagementPermission(monitor)

VM.dynlibs

打印已加载的动态库。

影响:低

权限:java.lang.management.ManagementPermission(monitor)

VM.info

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

影响:低

权限:java.lang.management.ManagementPermission(monitor)

VM.log options

列出当前日志配置,启用/禁用/配置日志输出,或轮换所有日志。

影响:低

权限:java.lang.management.ManagementPermission(control)

options:

注意

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

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

  • output_options: (可选) 输出的选项。(字符串,无默认值)

  • what: (可选) 配置要记录的标签。(字符串,无默认值)

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

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

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

  • rotate: (可选) 轮换所有日志。(布尔值,无默认值)

VM.flags options

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

影响:低

权限:java.lang.management.ManagementPermission(monitor)

注意

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

options:

  • -all: (可选) 打印 VM 支持的所有标志(布尔值,false)。

VM.native_memory options

打印本机内存使用情况

影响:中等

权限:java.lang.management.ManagementPermission(monitor)

注意

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

options:

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

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

  • baseline: (可选) 请求运行时对当前内存使用情况进行基线,以便可以与以后的时间进行比较。(布尔值,false)

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

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

  • shutdown: (可选) 请求运行时关闭自身并释放运行时使用的内存。 (布尔值,false)

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

  • scale: (可选) 内存使用量以什么比例,KB、MB 或 GB (字符串,KB)

VM.print_touched_methods

打印在该 JVM 的生命周期中曾经被触及的所有方法。

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

VM.set_flag arguments

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

影响:低

权限:java.lang.management.ManagementPermission(control)

arguments:

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

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

VM.stringtable options

转储字符串表。

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

权限:java.lang.management.ManagementPermission(monitor)

注意

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

options:

  • -verbose: (可选) 转储表中每个字符串的内容 (布尔值,false)

VM.symboltable options

转储符号表。

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

权限:java.lang.management.ManagementPermission(monitor)

注意

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

options:

  • -verbose: (可选) 转储表中每个符号的内容 (布尔值,false)

VM.systemdictionary

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

影响:中等

权限:java.lang.management.ManagementPermission(monitor)

注意

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

options:

  • verbose: (可选) 转储所有类加载器的每个字典条目的内容 (布尔值,false)。

VM.system_properties

打印系统属性。

影响:低

权限:java.util.PropertyPermission(*, read)

VM.uptime options

打印 VM 运行时间。

影响:低

注意

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

options:

  • -date: (可选) 添加带有当前日期的前缀 (布尔值,false)

VM.version

打印 JVM 版本信息。

影响:低

权限:java.util.PropertyPermission(java.vm.version, read)


最后更新: 2021 年 9 月 14 日


当前教程
Jcmd - 向 JVM 发送诊断命令
系列中的下一个

系列中的下一个: Jdb - 修复 Java 程序中的错误