作者 | flydean程序那些事

责编 | 郭芮

出品 | CSDN博客

jcmd是JDK自带的调试工具,具有非常强大的功能。jcmd是JDK7中正式引入的,有了jcmd,完全可以替换很多常用的其他工具,比如jstak和jmap。

jcmd可以将具体的诊断命令发送给JVM。为了安全起见,使用jcmd的用户必须跟运行的java程序具有同样的用户和用户组。

jcmd的调试命令有很多种,每一种调试命令又有自己的参数。

本文将会结合具体的例子详细讲解jcmd的使用。

jcmd的语法

jcmd的语法比较简单:

jcmd [pid | main-class] command... | PerfCounter.print | -f filenamejcmd [-l]jcmd -h

pid和main-class是二选一:

其中pid表示要发送诊断命令的java进程id。

也可以指定main-class,表示要发送诊断命令给运行该main-class的java进程。

command表示可以在jcmd中运行的命令,我们看下jcmd支持哪些命令:

./jcmd 93989 help
93989:
The following commands are available:
Compiler.CodeHeap_Analytics
Compiler.codecache
Compiler.codelist
Compiler.directives_add
Compiler.directives_clear
Compiler.directives_print
Compiler.directives_remove
Compiler.queue
GC.class_histogram
GC.class_stats
GC.finalizer_info
GC.heap_dump
GC.heap_info
GC.run
GC.run_finalization
JFR.check
JFR.configure
JFR.dump
JFR.start
JFR.stop
JVMTI.agent_load
JVMTI.data_dump
ManagementAgent.start
ManagementAgent.start_local
ManagementAgent.status
ManagementAgent.stop
Thread.print
VM.class_hierarchy
VM.classloader_stats
VM.classloaders
VM.command_line
VM.dynlibs
VM.events
VM.flags
VM.info
VM.log
VM.metaspace
VM.native_memory
VM.print_touched_methods
VM.set_flag
VM.stringtable
VM.symboltable
VM.system_properties
VM.systemdictionary
VM.uptime
VM.version
help

Perfcounter.print表示要打印java进程暴露的performance counters。

  • -f filename表示从文本文件中读取要运行的命令。

  • -l 列出不是运行在docker中JVM。

  • -h 表示帮助。

下面我们举几个常用的例子。

列出运行的JVM

./jcmd -l
98109 jdk.jcmd/sun.tools.jcmd.JCmd -l

通过使用jcmd -l可以列出所有正在运行的JVM进程。跟jps是一样的。

打印stack信息

使用jcmd pid Thread.print -l可以打印出java程序的stack信息。其中-l表示输出java.util.concurrent的lock信息。

下面看个简单的例子:

./jcmd 93989 Thread.print -lFull thread dump Java HotSpot(TM) 64-Bit Server VM (14.0.1+7 mixed mode, sharing):Threads class SMR info:
_java_thread_list=0x00007fbeb1c4cb10, length=12, elements={
0x00007fbeb282a800, 0x00007fbeb282d800, 0x00007fbeb282e800, 0x00007fbeb2830800,
0x00007fbeb2831800, 0x00007fbeb2832000, 0x00007fbeb2833000, 0x00007fbeb3831000,
0x00007fbeb3822000, 0x00007fbeb3174000, 0x00007fbeb3815000, 0x00007fbeb226f800
}"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=0.64ms elapsed=8996.59s tid=0x00007fbeb282a800 nid=0x4703 waiting on condition  [0x000070000440d000]java.lang.Thread.State: RUNNABLEat java.lang.ref.Reference.waitForReferencePendingList(java.base@14.0.1/Native Method)at java.lang.ref.Reference.processPendingReferences(java.base@14.0.1/Reference.java:241)at java.lang.ref.Reference$ReferenceHandler.run(java.base@14.0.1/Reference.java:213)Locked ownable synchronizers:- None

打印heap info

使用jcmd pid GC.heap_info可以获得heap info。

./jcmd 93989 GC.heap_dump heap_dump.out
93989:
Dumping heap to heap_dump.out ...
Heap dump file created [27727979 bytes in 0.643 secs]

打印heap dump

如果想知道heap里面到底有什么,则可以通过下面的命令将heap dump出来:

./jcmd 93989 GC.heap_dump heap_dump.out
93989:
Dumping heap to heap_dump.out ...
Heap dump file created [27727979 bytes in 0.643 secs]

heap dump需要传入一个文件名,存放dump出来的信息。

统计heap使用情况

有时候我们需要统计一下heap中各个对象的使用情况,则可以下面方法:

./jcmd 93989 GC.class_histogram93989:num     #instances         #bytes  class name (module)
-------------------------------------------------------1:         25826       11748304  [B (java.base@14.0.1)2:          2233        1971800  [I (java.base@14.0.1)3:          5154         614928  java.lang.Class (java.base@14.0.1)4:         24757         594168  java.lang.String (java.base@14.0.1)5:          4491         439432  [Ljava.lang.Object; (java.base@14.0.1)6:         13177         421664  java.util.concurrent.ConcurrentHashMap$Node (java.base@14.0.1)7:          5025         160800  java.util.HashMap$Node (java.base@14.0.1)8:          8793         140688  java.lang.Object (java.base@14.0.1)9:           212         103584  [Ljava.util.concurrent.ConcurrentHashMap$Node; (java.base@14.0.1)

上面的结果非常有用,在一些性能调试方法可以起到意想不到的作用。

JFR功能

jcmd还支持jfr功能。JFR的全称叫做Java Flight Recorder。你可以将其看做是JVM中一些事件的记录器。

jcmd还有很多其他的功能,大家可以多用多探索。

声明:本文为CSDN博主「flydean程序那些事」的原创文章,原文链接:https://blog.csdn.net/superfjj/article/details/106046174

更多精彩推荐
☞如何告别“芯繁魂乱”难题?这个 OS 来支招!
☞零基础物联网开发,踩坑无数,得到这份宝典 | 原力计划
☞深度剖析数据库国产化迁移之路
☞Go远超Python,机器学习人才极度稀缺,全球16,655位程序员告诉你这些真相
☞我佛了!用KNN实现验证码识别,又 Get 到一招
☞超级账本Hyperledger Fabric中的Protobuf到底是什么?
你点的每个“在看”,我都认真当成了喜欢

JDK 14 调试神器了解一下?| 原力计划相关推荐

  1. JDK 14 调试神器了解一下?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群",加入新技术 来源:8rr.co/z4R2 jcmd是JDK自带的调试工具,具有 ...

  2. 你离黑客的距离,就差这 20 个神器了 | 原力计划

    作者 | 编程技术宇宙 责编 | 王晓曼 出品 | CSDN博客 在不少电影电视剧中,主角的身边都有这么一位电脑高手:他们分分钟可以黑进反派的网络,攻破安全防线,破解口令密码,拿到重要文件.他们的电脑 ...

  3. 你有真正理解 Java 的类加载机制吗?| 原力计划

    作者 | 宜春 责编 | Elle 出品 | CSDN 博客 你是否真的理解Java的类加载机制?点进文章的盆友不如先来做一道非常常见的面试题,如果你能做出来,可能你早已掌握并理解了Java的类加载机 ...

  4. 吐血整理!顶级程序员的百宝箱来咯!| 原力计划

    作者 | 敖丶丙 责编 | Elle 出品 | CSDN 博客 你知道的越多,你不知道的越多 因为读者很多还是学生,还有很多应届生,对一个需求的研发流程都不是很熟悉,还有可能对于以后自己需要使用到的工 ...

  5. Java 那些最常用的工具类库 | 原力计划

    作者 |  Java 识堂 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) Apache Commons Apache Commons有很多子项目,常用的项目如下: BeanUtils ...

  6. 利用OpenCV实现抖音最强变脸术 | CSDN原力计划

    作者 | 亓斌 来源 | CSDN原力计划获奖作品 (*点击阅读原文,查看作者更多文章) 最近一个"最强变脸术"又火爆抖音啦,还不知道的朋友建议先打开抖音,搜索"最强变脸 ...

  7. 美团BERT的探索和实践 | CSDN原力计划

    扫码参与CSDN"原力计划" 作者 | 杨扬 佳昊 金刚等 来源 | CSDN原力计划作品 *点击阅读原文,查看美团技术团队更多干货文章. 背景 2018年,自然语言处理(Natu ...

  8. 全面分析阿里数据中台,小白也能看懂 | CSDN原力计划

    扫码参与CSDN"原力计划" 作者 | yuanziok 来源 | CSDN原力计划获奖作品 数据中台被誉为大数据的下一站,由阿里兴起,核心思想是数据共享,2015年阿里提出&qu ...

  9. Spring 从入门到入土——AOP 就这么简单!| 原力计划

    作者|  冢狐 责编 | 夕颜 出品 | CSDN博客 什么是AOP? 面向切面编程(Aspect Oriented Programming),通过预编译的方式和运行期动态代理实现程序功能的统一维护的 ...

最新文章

  1. 阿里巴巴研究员叔同:云原生是企业数字创新的最短路径
  2. jQuery.inArray()方法
  3. C# DataTable笔记
  4. 用计算机画有常数的函数图像,信息技术应用 用计算机画函数图象教学设计及教案分析...
  5. 7天拿到阿里安卓岗位offer,统统给你解决!
  6. Scheduled SQL: SLS 大规模日志上的全局分析与调度
  7. 帝国CMS模板|中国历史网整站数据MIP源码下载、带Tags提取插件
  8. 荣耀X20 SE评测:6400万高清美拍 2000元以下真香现场
  9. (转)配置Website的IIS时遇到的问题与解决方法
  10. javaweb 获取服务器整个文件夹下的文件_详细得不要不要的 JavaWeb快速入门,值得收藏!...
  11. 【学习笔记】《分布式光纤振动传感系统技术的研究与实现--华科--邹**--光学工程》重点笔记
  12. python 微商城_微商城是自己开发好还是用第三方平台好?
  13. linux下配置Tilera MDE4.1.8方法
  14. MAC安装STAF详解
  15. PhysX3.4文档(3) --Geometry
  16. 2021长安杯再做--wp
  17. C# EXCEL 删除行
  18. 你还要我怎样计算机音乐,你还要我怎样是什么歌抖音?
  19. 【手把手带你学习神经机器翻译--代码篇】
  20. Swift编程的15个技巧

热门文章

  1. 编译 OpenWrt/LEDE 基本过程
  2. Linux学习-逻辑滚动条管理员 (Logical Volume Manager)
  3. 七. 多线程编程11.线程的挂起、恢复和终止
  4. Windows下的git配置
  5. Spark:通过start-slaves.sh脚本启动worker报错:Permission denied
  6. kubenetes 1.4安装kube-UI
  7. java安装_如何在 Mac 上安装 Java | Linux 中国
  8. 剑指offer之链表中倒数第K个节点
  9. 惠普服务器装Linux7系统,如何安装惠普服务器操作系统
  10. PHP 照相 滤镜,PHP GIF / PNG True Colorize滤镜,可保留亮度和Alpha