https://www.cnblogs.com/codelogs/p/16535451.html

简介#

从JDK7开始,jdk提供了一个方便扩展的诊断命令jcmd,用来取代之前比较分散的jdk基础命令,如jps、jstack、jmap、jinfo等,并且jdk添加新的诊断功能,也会通过jcmd提供,所以还是有必要将这个命令熟悉起来的。

列出java进程#

jps提供了列出本机java进程的功能,jcmd与之类似,直接输入jcmd即可,如下:

$ jcmd
10732 app.jar
10767 sun.tools.jcmd.JCmd

可以看到,本机有一个app.jar的java进程。

列出jcmd支持的子命令#

$ jcmd 10732 help
10732:
The following commands are available:
VM.native_memory
VM.classloader_stats
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help

如上,可以看到,10732这个java进程支持了不少子命令呢!

查看java线程栈#

jcmd可以像jstack一样,打印java线程栈,使用jcmd 0 Thread.print即可,如下:

注:jcmd有个默认行为,当传递给jcmd的进程id是0时,jcmd会在本机所有java进程中执行子命令,这样我们就可以少操作一步了。

查看jvm堆情况#

jcmd可以快速查看当前堆容量、已使用容量等等关键信息,如下:

$ jcmd 0 GC.heap_info
10732:
garbage-first heap total 204800K, used 44778K [0x00000006f9a00000, 0x00000006f9b00640, 0x00000007c0000000)
region size 1024K, 44 young (45056K), 5 survivors (5120K)
Metaspace used 16876K, capacity 18012K, committed 18304K, reserved 1064960K
class space used 2101K, capacity 2330K, committed 2432K, reserved 1048576K

也可以像jmap一样查看堆直方图并转储堆内存到文件中,以分析内存不合理的占用问题,如下:

# 堆直方图,查看哪些类的对象实例最多
$ jcmd 0 GC.class_histogram
10732: num #instances #bytes class name
----------------------------------------------
1: 12659 1142376 [C
2: 3649 403376 java.lang.Class
3: 12644 303456 java.lang.String
4: 9020 288640 java.util.concurrent.ConcurrentHashMap$Node
5: 1378 280376 [B
6: 2241 183608 [I
7: 3351 164296 [Ljava.lang.Object;
8: 1554 133496 [Ljava.util.HashMap$Node;
9: 1192 104896 java.lang.reflect.Method
10: 77 104016 [Ljava.util.concurrent.ConcurrentHashMap$Node;
11: 6307 100912 java.lang.Object
12: 2517 100680 java.util.LinkedHashMap$Entry
13: 3071 98272 java.util.HashMap$Node
14: 1148 55104 java.util.HashMap
15: 1962 46856 [Ljava.lang.Class;
16: 782 43792 java.util.LinkedHashMap # 导出堆内存文件
$ jcmd 0 GC.heap_dump /home/work/heap.hprof
11377:
Heap dump file created

查看jvm属性等#

使用jinfo可以查看jvm属性与参数,jcmd同样也可以做到,如下:

# 查看jvm参数
$ jcmd 0 VM.flags
11377:
-XX:CICompilerCount=4 -XX:ConcGCThreads=2 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=209715200 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=3328180224 -XX:MaxNewSize=1996488704 -XX:MinHeapDeltaBytes=1048576 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC # 查看jvm属性
$ jcmd 0 VM.system_properties
11377:
#Sat Jul 30 16:50:33 CST 2022
java.runtime.name=OpenJDK Runtime Environment
java.protocol.handler.pkgs=org.springframework.boot.loader
sun.boot.library.path=/opt/jdk8u212-b03/jre/lib/amd64
java.vm.version=25.212-b03
java.vm.vendor=AdoptOpenJDK
java.vendor.url=http\://java.oracle.com/
path.separator=\:
java.vm.name=OpenJDK 64-Bit Server VM

查看堆外内存分配情况#

为了提升性能,很多基础框架使用了堆外内存,而jcmd可以检查堆外内存的使用情况,如下:

$ jcmd 0 VM.native_memory
11817:
Native Memory Tracking:
Total: reserved=4813774KB, committed=357358KB
- Java Heap (reserved=3250176KB, committed=204800KB)
(mmap: reserved=3250176KB, committed=204800KB)
- Class (reserved=1065417KB, committed=17225KB)
(classes #3070)
(malloc=457KB #4487)
(mmap: reserved=1064960KB, committed=16768KB)
- Thread (reserved=33955KB, committed=33955KB)
(thread #34)
(stack: reserved=33816KB, committed=33816KB)
(malloc=100KB #177)
(arena=39KB #62)
- Code (reserved=250612KB, committed=7124KB)
(malloc=1012KB #2197)
(mmap: reserved=249600KB, committed=6112KB)
- ...
- Symbol (reserved=4471KB, committed=4471KB)
(malloc=3376KB #25096)
(arena=1095KB #1)
- Arena Chunk (reserved=23038KB, committed=23038KB)
(malloc=23038KB)
- Unknown (reserved=6348KB, committed=0KB)
(mmap: reserved=6348KB, committed=0KB)

如上,能够看到jvm原生内存各个段的分配情况。

注:需要添加jvm参数-XX:NativeMemoryTracking=summary才能使用上述功能。

jvm性能数据#

通过PerfCounter.print可以查看jvm运行时的一些性能数据,如下:

$ jcmd 0 PerfCounter.print
...
sun.gc.tlab.alloc=6666220
sun.gc.tlab.allocThreads=4
sun.gc.tlab.fastWaste=0
sun.gc.tlab.fills=102
sun.gc.tlab.gcWaste=64976
sun.gc.tlab.maxFastWaste=0
sun.gc.tlab.maxFills=99
...
sun.rt._sync_ContendedLockAttempts=81
sun.rt._sync_Deflations=42
sun.rt._sync_EmptyNotifications=0
sun.rt._sync_FailedSpins=0
sun.rt._sync_FutileWakeups=15
...
sun.rt.safepointSyncTime=495700
sun.rt.safepointTime=19291400
sun.rt.safepoints=13

这里输出内容较多,可以看到jit、gc、tlab、sync、safepoint等的执行情况,当然要完全看懂这些指标,需要对jvm实现比较熟悉才行。

总结#

可以看到,jcmd提供的子命令还是挺多的,就不一一介绍了,具体可以通过jcmd 0 help查看。

往期内容#

接口偶尔超时,竟又是JVM停顿的锅!
耗时几个月,终于找到了JVM停顿十几秒的原因
mysql的timestamp会存在时区问题?
真正理解可重复读事务隔离级别
密码学入门
字符编码解惑

作者:打码日记

[转帖] JVM诊断命令jcmd介绍的更多相关文章

  1. JVM监控命令

    1.概述Jcmd是一个诊断Jvm的命令集工具, 集成了包括Jps, Jstack以及采集JFR信息等功能. 它必须运行在被诊断Jvm进程的同一台机器上.1)查询JVM进程及PID/dapeng-con ...

  2. 十二、jdk工具之jcmd介绍(堆转储、堆分析、获取系统信息、查看堆外内存)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  3. 十一、jdk命令之Jstatd命令(Java Statistics Monitoring Daemon)远程的监控工具连接到本地的JVM执行命令

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  4. JVM常用命令和性能调优建议 [Could not create the Java virtual machine]

    一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. ...

  5. JVM常用命令和性能调优建议

      一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程 ...

  6. JVM 内部运行线程介绍

    转(http://club.alibabatech.org/article_detail.htm?articleId=4) JVM 内部运行线程介绍 作者:蒋家佳/觉梦(支付宝开发工程师) 浏览量: ...

  7. JVM监控命令详解(转)

    JVM监控命令基本就是 jps.jstack.jmap.jhat.jstat 几个命令的使用就可以了 JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外 ...

  8. linux配置网卡IP地址命令详细介绍及一些常用网络配置命令

    linux配置网卡IP地址命令详细介绍及一些常用网络配置命令2010-- 个评论 收藏 我要投稿 Linux命令行下配置IP地址不像图形界面下那么方 便,完全需要我们手动配置,下面就给大家介绍几种配置 ...

  9. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

  10. Mac OSX网络诊断命令

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 下面是一些Mac OSX下常用的网络诊断命令.它们能帮助我们发现网络问题.文中提到 ...

随机推荐

  1. MySQL篇:bug1_navicat添加外键保存后不起作用(消失)

    问题 在Nacicat premium中添加外键一保存就消失 用SQL语句也显示创建成功,没有报错,可是在INSERT中又起不到约束作用 解决办法 参考一下资料发现可能是表的类型不支持外键 要在 My ...

  2. 【华为云技术分享】STM32L476移植华为LiteOS系列教程(二)---开发前准备

    在进行移植华为LiteOS开发工作之前,我们是需要提前做一些准备工作,如:开发工具.环境.源码等相关事宜. 一.准备开发工具 STM32CubeMX用于生成工程文件:STM32CubeMX下载地址 I ...

  3. 云原生时代,政企混合云场景IT监控和诊断的难点和应对之道

    摘要:正是因为政企IT架构云化的云原生架构,相比之前的单体烟囱式架构,在监控诊断方面有着更多的难点和挑战,这也在业界催生出大量相关的标准和工具. 本文分享自华为云社区<[华为云Stack][大架 ...

  4. SAST + SCA: 结合使用安全升级

    据 SAP 称,当今85%的安全攻击针对的是软件应用程序,因此一些列应用程序安全测试工具也应运而生.为了避免这些恶意攻击,企业通常使用应用程序安全测试工具来去缓解和解决安全风险,而不同的工具对应的使用 ...

  5. ByConity 社区回顾|ByConity 和开发者们一起展望未来,携手共进!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 新年伊始,我们想在这里感谢一群 ByConity 社区的小伙伴们. 正是因为有社区的开发者的支持,截止到 2023 ...

  6. 火山引擎AB测试:广告实验深度打通巨量引擎,高效测试广告素材

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   近期,火山引擎AB测试DataTester上线了新版的广告AB实验,还推出了与巨量引擎深度打通的能力.用户可以 ...

  7. HanLP — HMM隐马尔可夫模型 -- 训练&预测

    BMES => B-begin:词语开始.M-middle:词语中间.E-end:词语结束.S-single:单独成词 训练的过程,就是求三个矩阵的过程 初始概率矩阵 转移概率矩阵 发射矩阵 每 ...

  8. Intellij IDEA 显示 access.log 日志

    先配置  SpringBoot 记录 access.log 日志,先让accesslog 显示出来

  9. Vue | vuex安装失败解决的方法实例

    Vuex是一个专为Vue.js应用程序开发的状态管理模式 下面这篇文章主要给大家介绍了关于vuex安装失败解决的方法,文中通过图文介绍的非常详细,需要的朋友可以参考下 1.报错信息: npm ERR! ...

  10. 机器学习 | 分类性能度量指标 : ROC曲线、AUC值、正确率、召回率

    本篇博客的图源来自 zhwhong,转载仅作学习使用! 在分类任务中,人们总是喜欢基于错误率来衡量分类器任务的成功程度.错误率指的是在所有测试样例中错分的样例比例.实际上,这样的度量错误掩盖了样例如何 ...