上篇文章里《JVM常用性能调优工具详解1》我们已经探究了jps、jstat等监控工具,以及jinfo、jmap、jstack、jhat等故障排查工具,这里我单独拿出一篇文章,特别介绍jcmd。(因为jcmd这玩意细节太多了,整理文档就整理了好几个小时…)

jcmd

jcmd全称JVM Command,用于将诊断命令请求发送到正在运行的Java虚拟机,从JDK 7开始提供。

使用说明

命令如下:

-f				从文件读取并执行命令
-l 列出本机上的所有JVM进程
  • 1
  • 2

我们先来看一下最简单的jcmd -l
可以查看当前正在运行的所有JVM进程,和jps有点类似

jcmd -h可以查看jcmd的帮助文档。

再来看一下jcmd <pid | main class> <command ...| PerfCounter.print | -f file>
这个命令

参数说明:

  • 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效果相同。

我们先用PerfCounter.print玩一下:

这样我们就能看到12735这个进程的性能计数器

我们换种玩法
先用jps -l获取启动类。

然后用jcmd跟上启动类:

可以发现也能正常获取结果。
当然最主要的还是另一种复杂的玩法,就是跟命令的形式。
那么jcmd有哪些命令呢?

下面我总结出了全网最全的jcmd的命令以及使用说明。整理这篇命令手记花费了作者大量的精力,可以说是全网无出其右,建议小伙伴们保存下来,方便后续查看。

支持的命令

1.help [options] [arguments]
  • 作用:查看指定命令的帮助信息
  • arguments:想查看帮助的命令(STRING,无默认值)
  • options:选项,必须使用key或者key=value的语法指定,可用的options如下:
    • -all:(可选)查看所有命令的帮助信息(BOOLEAN,false)

使用示例:

# 获得指定进程可用的命令列表
jcmd <pid> help
# 获取指定进程、指定命令的帮助信息,如果参数包含空格,需要用 ' 或者 " 引起来
jcmd <pid> help <command>
  • 1
  • 2
  • 3
  • 4
2.Compiler.codecache
  • 作用:打印code cache(代码缓存)的布局和边界
  • 影响:低
  • 所需权限:java.lang.management.ManagementPermission(monitor)
3.Complier.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

使用示例:

# 展示指定进程类的元数据的所有统计信息
jcmd 12737 GC.class_stats -all

InstBytes、KlassBytes等列的含义

jcmd 12737 GC.class_stats -help

显示InstBytes,KlassBytes这两列,并生成csv

jcmd 12737 GC.class_stats -cvs InstBytes,KlassBytes > t.csv
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
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:(可选)转储所有对象,包括不可达对象(BOOLEAN,false)
  • arguments:参数,可用的参数如下:
    • filename:Dump文件的名称(STRING,无默认值)

使用示例:

jcmd 12737 GC.heap_dump -all 1.hprof
  • 1
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.runFianlization()
  • 影响:中(取决于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. JVMMTI.data_dump
  • 作用:通知JVM堆JVMTI进行数据转储
  • 影响:高
  • 所需权限:java.lang.management.ManagementPermission(monitor)
23. ManagentAgent.start [options]
  • 作用:启动远程管理代理
  • 影响:低
  • option:选项,必须使用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.password.file(STRING,无默认值)
    • jmxremote.acccess.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:(STIRNG,无默认值)
    • 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.autodiscoery(STRING,无默认值)
    • jdp.port:(可选)设置com.sun.management.jdp.port(INT,无默认值)
    • jdp.address:(可选)设置com.sun.management.jpdaddress(STRING,无默认值)
    • jdp.source_addr:(可选)设置com.sun.management.jdp.sourcce_addr(STRING,无默认值)
    • 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.mangement.ManagementPermission(monitor)
26.Management.Agent.stop
  • 作用:停止远程管理代理
  • 影响:低
27.Thread.print [options]
  • 作用:打印所有带有堆栈跟踪的线程
  • 影响:中(取决于线程数)
  • 所需权限:java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的语法指定,可用的options如下:
    • -l:(可选)打印java.util.concurrent锁(BOLEAN,false)

使用示例:

jcmd 12737 Thread.print -l
  • 1
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,无默认值)

使用示例:

jcmd 12737 VM.class_hierarchy -i -s javax.servlet.GenericFilter
  • 1
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,无默认值)
    • disable:(可选)关闭所有日志记录并清除日志配置。
    • list:(可选)列出当前的日志配置。(BOOLEAN,无默认值)
    • rotate:(可选)轮换所有日志。(布尔值,无默认值)

使用示例:

jcmd 12737 VM.log output what
  • 1
36. VM.flags [options]
  • 作用:打印VM标志及其当前值
  • 影响:低
  • 所需权限:java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的语法指定,可用的options如下:
    • -all:(可选)打印VM支持的所有标志(BOOLEAN,false)
37.VM.native_memory [options]

该功能叫做“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,无默认值)
VM.stringable [options]
  • 作用:转储字符串表(string table)
  • 影响:中 (取决于Java内容)
  • 所需权限:java.lang.management.ManagementPermission(monitor)
  • options:选项,必须使用key或者key=value的语法指定,可用的options如下:
    • -verbose:(可选)转储表中每个字符串的内容(BOOLEAN,false)

使用示例:

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

使用示例:

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

使用示例:

jcmd 12737 VM.systemdictionary -verbose
  • 1
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)
文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览138222 人正在系统学习中

[转帖]JVM性能调优工具2之jcmd详解(覆盖全网最全的jcmd命令与说明文档)的更多相关文章

  1. 【十一】jvm 性能调优工具之 jmap

    jvm 性能调优工具之 jmap 概述 命令jmap是一个多功能的命令.它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息.查看 ClassLoader 的信息以及 fi ...

  2. jvm 性能调优工具之 jps 命令详解

    JPS名称:jps - Java Virtual Machine Process Status Tool命令用法:jps [options] [hostid] options:命令选项,用来对输出格式 ...

  3. [转帖]JVM性能调优详解

    JVM性能调优详解 https://www.cnblogs.com/secbro/p/11833651.html 应该是 jdk8 以前的方法 貌似permsize 已经放弃这一块了. 前面我们学习了 ...

  4. JVM 性能调优工具

    jdk自带的工具,在macOs系统中的目录位置(jdk具体版本位置要替换):/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Ho ...

  5. 【十三】jvm 性能调优工具之 jstack

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  6. jvm 性能调优工具之 jstat

    概述 Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建 ...

  7. jvm 性能调优工具之 jstat 命令详解

    Jstat名称:Java Virtual Machine statistics monitoring tool 官方文档:https://docs.oracle.com/javase/1.5.0/do ...

  8. 【十二】jvm 性能调优工具之 jhat (JVM Heap Analysis Tool)

    jhat也是jdk内置的工具之一.主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言. jhat 非常耗费cpu和内存,所以一般不使 ...

  9. jvm 性能调优工具之 jmap

    概述 命令jmap是一个多功能的命令.它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息.查看 ClassLoader 的信息以及 finalizer 队列. jmap ...

  10. jvm 性能调优工具之 jmap 命令详解

    jmap名称:Java Memory Map(内存映射) 官方文档:https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html ...

随机推荐

  1. 1.7每日总结-vue链mysql4

    新建/server/router.js,用于配置对应路由let express = require('express')let router = express.Router()let user = ...

  2. Spring Boot整合Spring Data连接postgreSQL完成简单的CRUD操作

    导入jpa依赖和postgresql依赖: <!-- jpa依赖 --> <dependency> <groupId>org.springframework.boo ...

  3. 【scikit-learn基础】--『监督学习』之 随机森林分类

    随机森林分类算法是一种基于集成学习(ensemble learning)的机器学习算法,它的基本原理是通过对多个决策树的预测结果进行平均或投票,以产生最终的分类结果. 随机森林算法可用于回归和分类问题 ...

  4. Go 语言为什么不支持并发读写 map?

    大家好,我是 frank ,「 Golang 语言开发栈」公众号作者. 01 介绍 在 Go 语言项目开发中,我们经常会使用哈希表 map,它的时间复杂度是 O(1),Go 语言中的 map 使用开放 ...

  5. 一些JavaSE学习过程中的思路整理(三)(主观性强,持续更新中...)

    目录 一些JavaSE学习过程中的思路整理(三)(主观性强,持续更新中...) Java线程同步的几种常见情况分析 由简单到复杂的几种单例模式写法 死锁的实现与破解 使用lambda表达式化简代码 J ...

  6. 【华为云技术分享】空间异常即刻诊断,华为云数据管理服务DAS又出新招

    摘要:华为云数据管理服务DAS提供的云DBA智能化运维平台于日前发布了空间&元数据分析特性,支持查看实例空间异常列表.实例空间概况.数据库列表信息,帮助用户及时发现数据库中的空间和元数据异常, ...

  7. 解惑“高深”的Kafka时间轮原理,原来也就这么回事!

    [摘要] Kafka时间轮是Kafka实现高效的延时任务的基础,它模拟了现实生活中的钟表对时间的表示方式,同时,时间轮的方式并不仅限于Kafka,它是一种通用的时间表示方式,本文主要介绍Kafka中的 ...

  8. 5步教你将MRS数据导入DWS

    摘要:GaussDB(DWS)支持在相同网络中,配置一个GaussDB(DWS)集群连接到一个MRS集群,然后将数据从HDFS中的文件读取到GaussDB(DWS). MapReduce服务(MapR ...

  9. iOS 应用上架的步骤和工具简介

    编辑 APP开发助手是一款能够辅助iOS APP上架到App Store的工具,它解决了iOS APP上架流程繁琐且耗时的问题,帮助跨平台APP开发者顺利将应用上架到苹果应用商店.最重要的是,即使没有 ...

  10. 【django-vue】 项目上线 uuid重复问题 内网穿透 支付宝验签 nginx集群 远程连接redis 使用uwsgi启动django

    目录 上节回顾 uuid重复问题 内网穿透 支付宝验签 今日内容 1 上线架构图 2 阿里云购买 3 安装git和其他依赖 4 云服务器安装mysql 5 云服务器安装redis(源码安装) 远程连接 ...