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. [Python急救站]含义GUI的学生管理系统

    这个管理系统是含有GUI界面的学生管理系统,比较方便. import tkinter as tk class Student: def __init__(self, name, student_id, ...

  2. linux中创建新用户并且放到用户组中

    1.打开终端并以 root 用户身份登录到 Linux 系统 2.使用以下命令创建一个新用户 sudo useradd -m username 将 "username" 替换为你要 ...

  3. Spring Boot 应用部署流程

    在本机操作,执行以下步骤启动项目 1.从Github上下载源码 git clone https://github.com/ChinaSilence/any-video.git 2.在数据库中建库,建表 ...

  4. 云小课|MRS基础操作之配置DataNode容量均衡

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:当HDFS集群出现 ...

  5. 华为云GaussDB专家走进课堂,跟莘莘学子聊聊数据库

    摘要:华为云GaussDB走进北邮,技术专家走进课堂带来数据库前沿资讯. 近期,各地疫情又一次席卷而来,居家隔离成为常态.不过,外出的不便并没有阻挡莘莘学子求知的渴望,线上课堂成为了大多学生上课的主要 ...

  6. 再谈BOM和DOM(2):DOM节点层次/属性/选择器/节点关系/操作详解

    DOM模型将整个文档(XML文档和HTML文档)看成一个树形结构,并用document对象表示该文档. 根据W3C DOM规范,DOM是HTML与XML的应用编程接口(API),DOM将整个页面映射为 ...

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

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

  8. SpringBoot 2.x 正式停更了。Java 8 就看 Solon 的了!

    最近有好多个新闻说:SpringBoot 2.x 正式停更了,Java 8 怎么办?当然用 Solon 喽! Solon,同时支持 jdk8, jdk11, jdk17, jdk21.也支持 graa ...

  9. 自然语言处理 Paddle NLP - 机器同传技术及应用-理论

    基础 自然语言处理(NLP) 自然语言处理PaddleNLP-词向量应用展示 自然语言处理(NLP)-前预训练时代的自监督学习 自然语言处理PaddleNLP-预训练语言模型及应用 自然语言处理Pad ...

  10. selenium 开源UI测试工具

    简介 selenium是一个用于Web应用程序测试的工具.selenium测试直接运行于浏览器网页上,可以模拟用户操作网页.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Fi ...