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. 这一次,弄明白JS中的文件相关(一):概念篇

    概念是学习的基础.在学习JS中的文件操作之前,先把文件相关的各种概念搞清楚,很有好处. 1. 二进制: 计算机硬件仅能处理和存储二进制数据,所以不管是你正在写的代码,还是你硬盘里的小姐姐,都是以二进制 ...

  2. 从C++CLI工程的依赖库引用问题看.Net加载程序集机制

    问题 最近在为某第三方MFC项目写C++/CLI工程插件时遇到了如下一个问题: MFC的工程不允许把.Net的依赖程序集放到执行程序的目录(防止影响其稳定性),依赖库只能放到非执行程序子目录的其他目录 ...

  3. Java 打印Excel工作表

    示例要点 本文介绍如何通过Java程序打印Excel工作表.可通过以下方法打印: 默认打印机打印 指定打印机打印 程序环境 spire.xls.jar JDK版本要求1.6.0及以上的高版本 IDEA ...

  4. GaussDB for DWS:内存自适应控制技术总结

    1.技术背景 在SQL语句复杂.处理数据量大的AP场景下,单个查询对内存的需求越来越大,多个语句的并发很容易将系统的内存吃满,造成内存不足的问题.为了应对这种问题,GaussDB for DWS引入了 ...

  5. 智能对联模型太难完成?华为云ModelArts助你实现!手把手教学

    摘要:农历新年将至,听说华为云 AI 又将开启智能对对联迎接牛气冲天,让我们拭目以待!作为资深 Copy 攻城狮,想要自己实现一个对对联的模型,是不能可能完成的任务,因此我搜罗了不少前人的实践案例,今 ...

  6. Python中Round函数:怎么解释?怎么用?

    摘要:在本文中,介绍了什么是round函数以及如何从python内核中实现它.同时,还介绍舍入函数的一些缺点,以及如何纠正它们,如何在数据科学中广泛使用的库中发挥作用. Python中的舍入函数,返回 ...

  7. 华为云企业级Redis揭秘第15期:Redis为什么需要强一致?

    摘要:其实开源Redis的弱一致性已经不满足很多应用场景的诉求.怎么,不信? 本文分享自华为云社区<华为云企业级Redis揭秘第15期:Redis为什么需要强一致?>,作者: GaussD ...

  8. 为啥你写的代码老有大串的if/else?

    摘要:控制语句,到底何错之有呢? 本文分享自华为云社区<业务代码如何才能不再写出大串的if/else?>,作者: JavaEdge . 控制结构?没错!你最爱的 if.for都是一类坏味道 ...

  9. Axure 创建轮播图

    拖一个动态面板,设置名称 双击动态面板,添加3个状态 给3个状态,分别添加3张图片 设置交互 新建交互 -> 载入时 -> 设置面板状态 双击进去,界面看得直观些 下一项.向后循环,循环间 ...

  10. 大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka

    目录 作用 app 产生各层数据的 flink 任务 bean 数据对象 common 公共常量 utils 工具类 app.ods.FlinkCDC.java package com.atguigu ...