简介

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

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

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

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

jcmd的语法

jcmd的语法比较简单:

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

jcmd [-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 -l

Full 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: RUNNABLE

at 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_info

93989:

garbage-first heap total 71680K, used 34410K [0x00000007d4400000, 0x0000000800000000)

region size 1024K, 20 young (20480K), 4 survivors (4096K)

Metaspace used 23810K, capacity 24246K, committed 24752K, reserved 1071104K

class space used 2850K, capacity 3015K, committed 3072K, reserved 1048576K

打印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_histogram

93989:

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中一些事件的记录器。

有关JFR的更多内容,将会在我的下一篇文章中详细讲解。

总结

jcmd还有很多其他的功能,大家可以多用多探索。本文作者:flydean程序那些事

本文链接:jcmd:JDK14中的调试神器​www.flydean.com

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

jdk中java程序调试_jcmd:JDK14中的调试神器相关推荐

  1. 解决Java程序在MOTO E680i中声音文件播放

    这几天一直在用MOTO SDK来开发一款用于Moto E680i的JAVA游戏,利用BLOG发表一些心得: MOTO系列手机中JAVA程序播放一个声音文件比较简单,但是用于交互式音效时就有问题了. 根 ...

  2. 完美解决Java程序在 MOTO E680i 中声音文件播放

    这几天一直在用MOTO SDK来开发一款用于Moto E680i的JAVA游戏,利用BLOG发表一些心得: MOTO系列手机中JAVA程序播放一个声音文件比较简单,但是用于交互式音效时就有问题了. 根 ...

  3. 完美解决Java程序在 MOTO E680i 中声音文件播放(转载)

    这几天一直在用MOTO SDK来开发一款用于Moto E680i的JAVA游戏,利用BLOG发表一些心得: MOTO系列手机中JAVA程序播放一个声音文件比较简单,但是用于交互式音效时就有问题了. 根 ...

  4. 每个java程序都至少有一个线程给主线程,java程序在主线程中判断各个子线程状态的操作,该如何解决...

    java程序在主线程中判断各个子线程状态的操作 每个子线程在队列为空时会wait等待其他线程添加新url到队列,到最后所有子线程都取不到url时也会都wait住,要在主线程中判断如果所有的子线程都是w ...

  5. Java程序向MySql数据库中插入的中文数据变成了问号

    找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...

  6. idea中java程序打jar包的两种方式(超详细)

    java程序打成的jar包有两种类型,一种是可直接执行的runnable jar文件,另一种是包含多个主类,运行时需要指定主类全类名的jar包,下面我们细说在idea中两种jar包的打包方法及执行ja ...

  7. java程序阅读题6,阅读以下说明和java程序,填补代码中的空缺(1)~(6),将解答填入答题纸的对 - 信管网...

    阅读以下说明和Java程序,填补代码中的空缺(1)-(6),将解答填入答题纸的对应栏内. [说明] 很多依托扑克牌进行的游戏都要先洗牌.下面的Java代码运行时先生成一副扑克牌,洗牌后再按顺序打印每张 ...

  8. Java程序员在面试中不通过的五个原因

    如今正是毕业生找工作的高峰期,那么在面试Java程序员的过程中会出现什么问题呢?有哪些问题是初入职场的Java程序员在面试中最容易犯的呢?下面,我总结了Java程序员在面试中不通过的五个原因,作为大家 ...

  9. 39岁java程序员,待业中,对前途很迷茫,每天都很焦虑,不知道该怎么办?

    39岁java程序员,待业中,对前途很迷茫,每天都很焦虑,不知道该怎么办?第一次看到这个问题,觉得挺无奈的.39岁这个年纪,工作应该也有10多年,对于程序员岗位,如果平时没有放弃学习,相信专业技术能力 ...

  10. java 64位 默认分配内存大小_查看你机器中Java程序堆内存的默认初始大小和最大大小...

    很多时候,我们运行的Java程序并没有设定堆的内存限制参数,正常来说可以有两个参数来指定初始分配的堆内存和堆内存的最大值,分别为: -Xmx 用来设置你的应用程序(不是JVM)能够使用的最大内存数(相 ...

最新文章

  1. 智能车竞赛:提问与回答
  2. Android http通信案例
  3. Python语言学习 (七)1.1
  4. 程序员生存定律--管理向左,技术向右
  5. Jerry Wang 2013年几篇比较受欢迎的SAP社区博客
  6. IntelliJ IDEA for Mac在MacOS模式下的版本控制/本地历史记录快捷键(VCS and Local History Shortcut)
  7. 黑客专用Linux发行版Kali Linux发布滚动更新版2016.1
  8. CSS类选择器选择多个类用逗号隔开
  9. 吴恩达斯坦福实验室发布MRNet数据集,包含1千多张标注膝关节核磁共振成像
  10. lisp画表盘刻度线_Lisp-Stat翻译 —— 第九章 统计绘图窗体
  11. python 成语库_README.md · 天宇之游/一个python的TK猜成语游戏 - Gitee.com
  12. 为何腾讯一直在推广“低配版”的QQ
  13. matlab中的sprintf函数,Matlab中disp和sprintf函数使用方法和区别介绍
  14. 简单了解cms(内容管理系统)
  15. mysql 自定义插件调试
  16. linux网卡连接失败设备无法激活
  17. 15 款精致mac应用
  18. 插鼠标出现 usb设备无法识别 解决办法
  19. 苹果发布Swift编程语言 - iOS移动开发周报
  20. 图片HTML标记是,HTML网页图片标记

热门文章

  1. Java基础知识——JNI入门介绍
  2. jupternote不同类之间相互调用(调用ipynb文件)
  3. mapreduce web日志预处理
  4. 第四季-专题15-网卡驱动程序设计
  5. SQL正则表达式的妙用
  6. Zara精讲C#.Cache、它和Redis区别是什么???
  7. 课堂破冰游戏“猜猜他是谁”
  8. 009 HDFS的shell命令(里面有一个安全模式)
  9. jacob将word转换为html
  10. dwz中的table