jcmd:JDK14中的调试神器
文章目录
- 简介
- jcmd的语法
- 列出运行的JVM
- 打印stack信息
- 打印heap info
- 打印heap dump
- 统计heap使用情况
- JFR功能
- 总结
简介
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_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 1071104Kclass 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_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中一些事件的记录器。
有关JFR的更多内容,将会在我的下一篇文章中详细讲解。
总结
jcmd还有很多其他的功能,大家可以多用多探索。
更多精彩内容且看:
- 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
- Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
- Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
- java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/jdk14-jcmd/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
jcmd:JDK14中的调试神器相关推荐
- JDK14中的java tools简介
文章目录 故事发生了 java tools简介 jaotc jar jarsigner java javac javadoc javap jcmd jconsole jdb jdeprscan jde ...
- python 如何边改代码边调试_Python 代码调试神器:PySnooper
给大家推荐本我自己写的电子书<PyCharm中文指南>,把各种 PyCharm 的高效的使用技巧用GIF动态图的形式展示出来.有兴趣的可以看它的在线文档: http://pycharm.i ...
- json.tojsonstring 导致cpu飙高_阿里调试神器立功了!进程导致Kubernetes节点CPU飙高的排查与解决...
来源:https://www.cnblogs.com/maxzhang1985/p/12673160.html 一.发现问题 在一次系统上线后,我们发现某几个节点在长时间运行后会出现CPU持续飙升的问 ...
- Vue调试神器vue-devtools - 插件下载安装
文章目录 Google如何安装调试Vue的神器`vue-devtools` ? 安装介绍: demo实例 - 演示代码: 相关文章链接: 1. https://github.com/vuejs/vue ...
- 嵌入式调试神器-虚拟示波器之JScope
调试神器-虚拟示波器之JScope 在进行嵌入式开发过程中,需要查看某些实时变化的变量,以MDK为例我们通常都是进入DEBUG模式下去肉眼观察,这种方式不太人性化,也比较容易错失掉许多细节.为此我介绍 ...
- web移动端调试神器Eruda
在Web开发过程中,对html页面进行开发和调试的时候都会用到浏览器提供的调试工具,小编我最常用的就是Chrome浏览器自带的开发者工具了,可以很方便的对JS代码进行断点调试,log也很方便.但是在移 ...
- vue 代码调试神器
一.序 工欲善其事,必先利其器.作为一名资深程序员,相信必有一款调试神器相伴左右,帮助你快速发现问题,解决问题.作为前端开发,我还很年轻,也喜欢去捣鼓一些东西,借着文章的标题,先提一个问题:大家目前是 ...
- html5页面调试工具,web移动端调试神器Eruda
在Web开发过程中,对html页面进行开发和调试的时候都会用到浏览器提供的调试工具,小编我最常用的就是Chrome浏览器自带的开发者工具了,可以很方便的对JS代码进行断点调试,log也很方便.但是在移 ...
- 虚拟串口软件+三菱仿真调试神器
虚拟串口软件+三菱仿真调试神器 手上没有三菱PLC也能玩plc?没关系,有了神器,一切都不是问题. 此软件可在PC上虚拟出一对串口,可用于两个软件之间进实现虚拟串口通讯. 有了这个媒介,三菱plc可以 ...
最新文章
- 一步一步学Silverlight 2系列(18):综合实例之RSS阅读器
- java c 流_java对象传输流C/S传输对象
- vue + element-ui 聊天_推荐6款Vue管理后台框架,收藏好,留备用
- oracle存储过程中数组的使用
- linux获取进程io,linux查看哪个进程占用磁盘IO
- python爬虫bs4_Python爬虫系列-Xpath自如和bs4链家
- Rsync总结笔记—以守护进程(socket)方式传输数据
- 基于ZFS+SAS的Tier2/backup存储系统解决方案
- Linux中Sort命令详解
- B站上优质python教程推荐
- winedit 永久试用的办法
- c语言 -- 三位数的逆序
- printf 中的伪灵异事件
- 地方政府留言板文本数据
- 视频监控客户端-GB28181之转码库-转码格式支持H265、H264、MPEG4、MPEG2
- 阿里巴巴java开发手册(泰山版)在线阅览
- 微信小程序之生成专属推广海报
- iOS逆向工程-工具篇
- Windows Phone 7芒果更新
- CLIPS 的简单认识