网站首页 > 开源技术 正文
作者 | 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 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_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_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到底是什么?
- 上一篇: 下个月,java要开启收费模式了,你怕了吗?
- 下一篇: 大数据分析:学习工具JDK,在线安装指南
猜你喜欢
- 2024-09-28 为什么JDK1.8要对HashMap进行红黑树的改动?
- 2024-09-28 程序员:JDK的安装与配置(完整版)(jdk软件安装教程)
- 2024-09-28 惊了,JDK都到23了,据说还有99%Java程序员都不会用optional?
- 2024-09-28 大数据分析:学习工具JDK,在线安装指南
- 2024-09-28 下个月,java要开启收费模式了,你怕了吗?
- 2024-09-28 JDK11升级JDK17最全实践干货来了(jdk11版本)
- 2024-09-28 JDK、JRE和JVM的区别与相互之间的联系
- 2024-09-28 Fury:一个基于JIT动态编译的高性能多语言原生序列化框架
- 2024-09-28 JDK 各版本(1~14)特性总结(jdk各个版本发布时间表)
- 2024-09-28 探索Java的起点:JDK是什么以及如何选择适合你的版本
你 发表评论:
欢迎- 03-19基于layui+springcloud的企业级微服务框架
- 03-19开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- 03-19SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- 03-19SpringBoot+LayUI后台管理系统开发脚手架
- 03-19layui下拉菜单form.render局部刷新方法亲测有效
- 03-19Layui 遇到的坑(记录贴)(layui chm)
- 03-19基于ASP.NET MVC + Layui的通用后台开发框架
- 03-19LayUi自定义模块的定义与使用(layui自定义表格)
- 最近发表
-
- 基于layui+springcloud的企业级微服务框架
- 开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- SpringBoot+LayUI后台管理系统开发脚手架
- layui下拉菜单form.render局部刷新方法亲测有效
- Layui 遇到的坑(记录贴)(layui chm)
- 基于ASP.NET MVC + Layui的通用后台开发框架
- LayUi自定义模块的定义与使用(layui自定义表格)
- Layui 2.9.11正式发布(layui2.6)
- Layui 2.9.13正式发布(layui2.6)
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)