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

2020 年 5 月 20 日 CSDN

作者 | 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 filename
jcmd [-l]
jcmd -h
pid和main-class是二选一:
其中pid表示要发送诊断命令的java进程id。
也可以指定main-class,表示要发送诊断命令给运行该main-class的java进程。
command表示可以在jcmd中运行的命令,我们看下jcmd支持哪些命令:
./jcmd 93989 help93989:The following commands are available:Compiler.CodeHeap_AnalyticsCompiler.codecacheCompiler.codelistCompiler.directives_addCompiler.directives_clearCompiler.directives_printCompiler.directives_removeCompiler.queueGC.class_histogramGC.class_statsGC.finalizer_infoGC.heap_dumpGC.heap_infoGC.runGC.run_finalizationJFR.checkJFR.configureJFR.dumpJFR.startJFR.stopJVMTI.agent_loadJVMTI.data_dumpManagementAgent.startManagementAgent.start_localManagementAgent.statusManagementAgent.stopThread.printVM.class_hierarchyVM.classloader_statsVM.classloadersVM.command_lineVM.dynlibsVM.eventsVM.flagsVM.infoVM.logVM.metaspaceVM.native_memoryVM.print_touched_methodsVM.set_flagVM.stringtableVM.symboltableVM.system_propertiesVM.systemdictionaryVM.uptimeVM.versionhelp
Perfcounter.print表示要打印java进程暴露的performance counters。
  • -f filename表示从文本文件中读取要运行的命令。

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

  • -h 表示帮助。

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

列出运行的JVM
./jcmd -l98109 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_dump heap_dump.out93989: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.out93989: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中一些事件的记录器。
jcmd还有很多其他的功能,大家可以多用多探索。
声明:本文为CSDN博主「flydean程序那些事」的原创文章,原文链接:https://blog.csdn.net/superfjj/article/details/106046174


更多精彩推荐

☞如何告别“芯繁魂乱”难题?这个 OS 来支招!

☞零基础物联网开发,踩坑无数,得到这份宝典 | 原力计划

深度剖析数据库国产化迁移之路

Go远超Python,机器学习人才极度稀缺,全球16,655位程序员告诉你这些真相

我佛了!用KNN实现验证码识别,又 Get 到一招

超级账本Hyperledger Fabric中的Protobuf到底是什么?

你点的每个“在看”,我都认真当成了喜欢
登录查看更多
0

相关内容

Java 是一门编程语言,拥有跨平台、面向对象、泛型编程等特性。
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
机器学习入门的经验与建议
专知会员服务
90+阅读 · 2019年10月10日
机器学习相关资源(框架、库、软件)大列表
专知会员服务
38+阅读 · 2019年10月9日
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
手把手教你用Python实现“坦克大战”,附详细代码!
机器学习算法与Python学习
11+阅读 · 2019年6月8日
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
GitHub 热门:别再用 print 输出来调试代码了
Python开发者
27+阅读 · 2019年4月24日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
Android P正式发布,你需要尽快做适配了
前端之巅
3+阅读 · 2018年8月7日
开发、调试计算机视觉代码有哪些技巧?
AI研习社
3+阅读 · 2018年7月9日
A Survey on Deep Learning for Named Entity Recognition
Arxiv
25+阅读 · 2020年3月13日
Music Transformer
Arxiv
5+阅读 · 2018年12月12日
Arxiv
7+阅读 · 2018年11月27日
Arxiv
5+阅读 · 2018年1月30日
Arxiv
26+阅读 · 2017年12月6日
VIP会员
相关VIP内容
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
机器学习入门的经验与建议
专知会员服务
90+阅读 · 2019年10月10日
机器学习相关资源(框架、库、软件)大列表
专知会员服务
38+阅读 · 2019年10月9日
相关资讯
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
手把手教你用Python实现“坦克大战”,附详细代码!
机器学习算法与Python学习
11+阅读 · 2019年6月8日
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
GitHub 热门:别再用 print 输出来调试代码了
Python开发者
27+阅读 · 2019年4月24日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
Android P正式发布,你需要尽快做适配了
前端之巅
3+阅读 · 2018年8月7日
开发、调试计算机视觉代码有哪些技巧?
AI研习社
3+阅读 · 2018年7月9日
Top
微信扫码咨询专知VIP会员