jcmd

作用

jcmd全称JVM Command,用于将诊断命令请求发送到正在运行的Java虚拟机,从JDK 7开始提供。
参考文档:
Java 8 Unix:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jcmd.html
Java 8 Windows:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jcmd.html
Java 11:https://docs.oracle.com/en/java/javase/11/tools/jcmd.html

使用说明

命令如下:

  1. jcmd -h
  2. Usage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
  3. or: jcmd -l
  4. or: jcmd -h
  5. command must be a valid jcmd command for the selected jvm.
  6. Use the command "help" to see which commands are available.
  7. If the pid is 0, commands will be sent to all Java processes.
  8. The main class argument will be used to match (either partially
  9. or fully) the class used to start Java.
  10. If no options are given, lists Java processes (same as -p).
  11. PerfCounter.print display the counters exposed by this process
  12. -f 从文件读取并执行命令
  13. -l 列出本机上的所有JVM进程
  14. -h this help

参数说明

  • pid:接收诊断命令请求的进程ID。
  • main class :接收诊断命令请求的进程的main类。jcmd会将诊断命令请求发送给具有指定main class的所有Java进程。
  • command:command必须是一个有效的jcmd命令,可使用 jcmd pid help 命令查看可用的命令列表。如果pid是0,那么command将会被发送给所有Java进程。main class会用来去匹配(局部匹配或全量匹配)。如果未指定任何选项,它将会列出正在运行的Java进程标识符以及用于启动该进程的main class和命令行参数(相当于使用了-l参数)
  • PerfCounter.print:打印指定Java进程上可用的性能计数器。
  • -f filename:从指定文件中读取命令并执行。在file中,每个命令必须写在单独的一行。以”#”开头的行会被忽略。当所有行的命令被调用完毕后,或者读取到含有stop关键字的命令,将会终止对file的处理。
  • -l:查看所有的JVM进程。jcmd不使用参数与jcmd -l效果相同。

    使用示例

    ```shell

    查看所有JVM进程

    jcmd -l

打印指定进程上可用的性能计数器

jcmd 26089 PerfCounter.print

打印所有启动类为com.imooc.Application的应用上可用的性能计数器

jcmd com.imooc.Application PerfCounter.print

打印指定进程的代码缓存的布局和边界

jcmd 26089 Compiler.codecache

  1. <a name="A0UC0"></a>
  2. ## 支持的命令
  3. <a name="M19J8"></a>
  4. ### 1 help [options] [arguments]
  5. - 作用:查看指定命令的帮助信息
  6. - arguments:想查看帮助的命令(STRING,无默认值)
  7. - options:选项,必须使用key或者key=value的预发指定,可用的options如下
  8. - -all:(可选)查看所有命令的帮助信息(BOOLEAN,false)
  9. 使用示例:
  10. ```shell
  11. # 获得指定进程可用的命令列表
  12. jcmd <pid> help
  13. # 获取指定进程、指定命令的帮助信息,如果参数包含空格,需用'或者"引起来
  14. jcmd <pid> help <command>

2 Compiler.codecache

  • 作用:打印code cache(代码缓存)的布局和边界
  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    3 Compiler.codelist

  • 作用:打印代码缓存中所有仍在运行的已编译方法

  • 影响:中
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    4 Compiler.queue

  • 作用:打印排队等待编译的方法

  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    5 Compiler.directives_add filename arguments

  • 作用:从文件添加编译器指令

  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(monitor)
  • filename:指令文件的名称(STRING,无默认值)

    6 Compiler.directives_clear

  • 作用:删除所有编译器指令

  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    7 Compiler.directives_print

  • 作用:打印所有活动的编译器指令。

  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    8 Compiler.directives_remove

  • 作用:删除最新添加的编译器指令。

  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    9 GC.class_histogram [options]

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

  • 影响:高-取决于Java堆的大小和内容。
  • 所需权限: java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:

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

      10 GC.class_stats [options] [arguments]

  • 作用:展示有关Java类元数据的统计信息

  • 影响:高-取决于Java堆的大小和内容。
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:
    • -all:(可选)显示所有列(BOOLEAN,false)
    • -csv:(可选)以CSV格式打印电子表格(BOOLEAN,false)
    • -help:(可选)显示所有列的含义(BOOLEAN,false)
  • arguments:参数,可选参数如下:
    • columns:(可选)要显示的列,以逗号分隔。如果不指定,则显示以下列:
      • InstBytes
      • KlassBytes
      • CpAll
      • annotations
      • MethodCount
      • Bytecodes
      • MethodAll
      • ROAll
      • RWAll
      • Total

使用示例:

  1. # 展示指定进程类的元数据的所有统计信息
  2. jcmd 48758 GC.class_stats -all
  3. # InstBytes、KlassBytes等列的含义
  4. jcmd 48758 GC.class_stats -help
  5. # 显示InstBytes,KlassBytes这两列,并生成csv
  6. jcmd 48758 GC.class_stats -csv InstBytes,KlassBytes > t.csv

11 GC.finalizer_info

  • 作用:展示有关Java finalization queue的信息。
  • 影响:中
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    12 GC.heap_dump [options] [arguments]

  • 作用:生成Java堆Dump文件(HPROF格式)

  • 影响:高-取决于Java堆的大小和内容。除非指定了 -all 选项,否则将会导致Full GC
  • 所需权限: java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:
    • -all:(可选)转储所有对象,包括不可达的对象(BOOLE AN,false)
  • arguments:参数,可用的参数如下:
    • filename:Dump文件的名称(STRING,无默认值)

使用示例:

  1. jcmd 48758 GC.heap_dump -all 1.hprof

13 GC.heap_info

  • 作用:展示Java堆信息。
  • 影响:中
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    14 GC.run

  • 作用:调用 java.lang.System.gc()

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

    15 GC.run_finalization

  • 作用: java.lang.System.runFinalization()

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

    16 JFR.check [options]

    请参阅《Java Flight Recorder命令参考》中的JFR.check

    17 JFR.configure [options]

    请参阅《Java Flight Recorder命令参考》中的JFR.configure

    18 JFR.dump [options]

    请参阅《Java Flight Recorder命令参考》中的JFR.dump

    19 JFR.start [options]

    请参阅《Java Flight Recorder命令参考》中的JFR.start

    20 JFR.stop [options]

    请参阅《Java Flight Recorder命令参考》中的JFR.stop

    21 JVMTI.agent_load [arguments]

  • 作用:加载JVMTI本机代理。

  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(control)
  • arguments:

    • library path:要加载的JVMTI代理的绝对路径(STRING,无默认值)
    • agent option:(可选)用于传递代理的选项字符串(STRING,无默认值)

      22 JVMTI.data_dump

  • 作用:通知JVM对JVMTI进行数据转储

  • 影响:高
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    23 ManagementAgent.start [options]

  • 作用:启动远程管理代理

  • 影响:低-无影响
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:

    • config.file:(可选)设置 com.sun.management.config.file(STRING,无默认值)
    • jmxremote.host:(可选)设置com.sun.management.jmxremote.host(STRING,无默认值)
    • jmxremote.port:(可选)设置com.sun.management.jmxremote.port(STRING,无默认值)
    • jmxremote.rmi.port:(可选)设置com.sun.management.jmxremote.rmi.port(STRING,无默认值)
    • jmxremote.ssl:(可选)设置com.sun.management.jmxremote.ssl(STRING,无默认值)
    • jmxremote.registry.ssl:(可选)设置com.sun.management.jmxremote.registry.ssl(STRING,无默认值)
    • jmxremote.authenticate:(可选)设置com.sun.management.jmxremote.authenticate(STRING,无默认值)
    • jmxremote.password.file:(可选)设置com.sun.management.jmxremote.password.file(STRING,无默认值)
    • jmxremote.access.file:(可选)设置com.sun.management.jmxremote.access.file(STRING,无默认值)
    • jmxremote.login.config:(可选)设置com.sun.management.jmxremote.login.config(STRING,无默认值)
    • jmxremote.ssl.enabled.cipher.suites:(可选)集com.sun.management。
    • jmxremote.ssl.enabled.cipher.suite:(STRING,无默认值)
    • jmxremote.ssl.enabled.protocols:(可选)设置com.sun.management.jmxremote.ssl.enabled.protocols(STRING,无默认值)
    • jmxremote.ssl.need.client.auth:(可选)设置com.sun.management.jmxremote.need.client.auth(STRING,无默认值)
    • jmxremote.ssl.config.file:(可选)设置com.sun.management.jmxremote.ssl_config_file(STRING,无默认值)
    • jmxremote.autodiscovery:(可选)设置com.sun.management.jmxremote.autodiscovery(STRING,无默认值)
    • jdp.port:(可选)设置com.sun.management.jdp.port(INT,无默认值)
    • jdp.address:(可选)设置com.sun.management.jdp.address(STRING,无默认值)
    • jdp.source_addr:(可选)设置 com.sun.management.jdp.source_addr(STRING,无默认值)
    • jdp.ttl:(可选)设置com.sun.management.jdp.ttl(INT,无默认值)
    • jdp.pause:(可选)设置com.sun.management.jdp.pause(INT,无默认值)
    • jdp.name:(可选)设置com.sun.management.jdp.name(STRING,无默认值)

      24 ManagementAgent.start_local

  • 作用:启动本地管理代理

  • 影响:低-无影响

    25 ManagementAgent.status

  • 作用:展示管理代理的状态

  • 影响:低-无影响
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    26 ManagementAgent.stop

  • 作用:停止远程管理代理

  • 影响:低-无影响

    27 Thread.print [options]

  • 作用:打印所有带有堆栈跟踪的线程。

  • 影响:中-取决于线程数。
  • 所需权限: java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:
    • -l:(可选)打印 java.util.concurrent 锁(BOOLEAN,false)

使用示例:

  1. jcmd 48758 Thread.print -l

28 VM.check_commercial_features

  • 作用:显示商业特性的状态
  • 影响:低-无影响

    29 VM.unlock_commercial_features

  • 作用:解锁商业功能

  • 影响:低-无影响
  • 所需权限: java.lang.management.ManagementPermission(control)

    30 VM.classloader_stats

  • 作用:打印所有ClassLoader的统计信息。

  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    31 VM.class_hierarchy [options] [arguments]

  • 作用:打印所有已加载类的列表,缩进以显示类层次结构。每个类的名称后跟其ClassLoader的ClassLoaderData* ,如果由bootstrap class loader加载,则为null

  • 影响:中-取决于已加载类的数量。
  • 所需权限: java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:
    • -i:(可选)打印继承的接口(BOOLEAN,false)
    • -s:(可选)如果指定了类名,则将打印子类。如果未指定类名,则仅打印超类(BOOLEAN,false)
  • arguments:参数,可用项如下:
    • classname:(可选)打印指定类的层次结构,如果未指定,则将打印所有类层次结构(STRING,无默认值)

使用示例:

  1. jcmd 48758 VM.class_hierarchy -i -s javax.servlet.GenericFilter

32 VM.command_line

  • 作用:打印用于启动此VM实例的命令行
  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(monitor)

    33 VM.dynlibs

  • 作用:打印加载的动态库

  • 影响:低
  • 允许: java.lang.management.ManagementPermission(monitor)

    34 VM.info

  • 作用:打印有关JVM环境和状态的信息

  • 影响:低
  • 允许: java.lang.management.ManagementPermission(monitor)

    35 VM.log [options]

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

  • 影响:低
  • 所需权限:java.lang.management.ManagementPermission(control)
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:
    • output:(可选)要配置的输出的名称或索引。(STRING,无默认值)
    • output_options:(可选)输出的选项。(STRING,无默认值)
    • what:(可选)配置要记录的标签。(STRING,无默认值)
    • decorators:(可选)配置要使用的装饰器。使用’none’或空值删除所有内容。(STRING,无默认值)
    • disable:(可选)关闭所有日志记录并清除日志配置。(布尔值,无默认值)
    • list:(可选)列出当前的日志配置。(布尔值,无默认值)
    • rotate:(可选)轮换所有日志。(布尔值,无默认值)

使用示例:

  1. jcmd 48758 VM.log output what

36 VM.flags [options]

  • 作用:打印VM标志及其当前值。
  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的语法指定,可用的options如下:

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

      37 VM.native_memory [options]

      TIPS
      译者注:该功能叫做“Native Memory Tracking (NMT)”,需开启如下参数,才可打开。
      -XX:NativeMemoryTracking=[off | summary | detail]
      打开后会带来5-10%的性能损耗。
      也可用 -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics ,让JVM在退出时打印NMT报告。
      参考文章:https://blog.csdn.net/varyall/article/details/86514888
  • 作用:打印native内存使用情况

  • 影响:中
  • 允许: java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:

    • summary:(可选)请求运行时报告当前内存摘要,包括所有保留和提交的内存以及每个子系统的内存使用情况摘要(BOOLEAN, false)
    • detail:(可选)请求运行时报告每个调用站点(callsite) > = 1K的内存分配(BOOLEAN, false)
    • baseline:(可选)请求运行时以当前内存使用情况为基准,以便以后进行比较(BOOLEAN, false)
    • summary.diff:(可选)请求运行时报告与先前基准的内存摘要比较(BOOLEAN, false)
    • detail.diff :(可选)请求运行时报告与先前基准的内存详情比较,该基准显示了在不同调用站点(callsite)的内存分配活动(BOOLEAN, false)
    • shutdown:(可选)请求运行时关闭自身并释放运行时使用的内存(BOOLEAN, false)
    • statistics:(可选)打印跟踪器统计信息以进行调整(BOOLEAN, false)
    • scale:(可选)以MB,MB或GB为单位的内存使用量(STRING, KB )

      38 VM.print_touched_methods

  • 作用:打印此JVM生命周期中曾经接触过的所有方法

  • 影响:中-取决于Java内容

    39 VM.set_flag [arguments]

  • 作用:设置VM标志

  • 影响:低
  • 所需权限: java.lang.management.ManagementPermission(control)
  • arguments:

    • 标志名称:您要设置的标志名称(STRING,无默认值)
    • 字符串值:(可选)要设置的值(STRING,无默认值)

      40 VM.stringtable [options]

  • 作用:转储字符串表(string table)

  • 影响:中-取决于Java内容。
  • 所需权限: java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:
    • -verbose:(可选)转储表中每个字符串的内容(BOOLEAN,false)

使用示例:

  1. jcmd 48758 VM.stringtable -verbose

41 VM.symboltable [options]

  • 作用:转储符号表
  • 影响:中-取决于Java内容
  • 所需权限: java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:
    • -verbose :(可选)转储表中每个符号的内容(BOOLEAN,false)

使用示例:

  1. jcmd 48758 VM.symboltable -verbose

42 VM.systemdictionary

  • 作用:打印字典哈希表大小和存储桶长度的统计信息
  • 影响:中
  • 所需权限: java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:
    • verbose :(可选)为所有class loader转储每个词典条目的内容(BOOLEAN,false)。

使用示例:

  1. jcmd 48758 VM.systemdictionary -verbose

43 VM.system_properties

  • 作用:打印系统属性
  • 影响:低
  • 所需权限: java.util.PropertyPermission(*, read)

    44 VM.uptime [options]

  • 作用:打印虚拟机的运行时间

  • 影响:低
  • options:选项,必须使用key或者key=value的预发指定,可用的options如下:

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

      45 VM.version

  • 作用:打印JVM版本信息

  • 影响:低
  • 所需权限: java.util.PropertyPermission(java.vm.version, read)