当前位置: 首页 > article >正文

JVM之jcmd命令详解

jcmd 是 Oracle JDK(Java Development Kit)自 JDK 7 起引入的一个强大的诊断工具,用于与正在运行的 JVM(Java Virtual Machine)实例进行交互。它允许用户执行各种诊断命令,比如线程堆栈分析、堆转储、GC 信息、类加载器统计等,非常适合在生产环境中对 Java 应用程序进行调试和监控。

一、jcmd 命令基本语法

jcmd <pid | main-class> <command> [options]
  • <pid>:目标 Java 进程的进程 ID。
  • <main-class>:目标 Java 应用的主类名(可以省略 jar 路径)。
  • <command>:具体的诊断命令,比如 VM.flags
  • [options]:命令附带的参数(具体取决于命令)。

二、查看可用的 Java 进程

jcmd
输出
970 com.dzy.Main
67890 org.apache.catalina.startup.Bootstrap

表示当前有两个 Java 进程在运行,它们的进程 ID 分别是 970 和 67890。


三、常用命令详解与使用示例

1. 查看所有支持的命令

jcmd <pid> help
用法
jcmd 970 help
输出

列出该 JVM 实例支持的所有命令:

970:
VM.version
VM.command_line
VM.flags
Thread.print
GC.heap_info
GC.run
GC.class_histogram
...

2. 查看 JVM 版本信息

jcmd <pid> VM.version
用法
jcmd 970 VM.version
输出
970:
Java HotSpot(TM) 64-Bit Server VM version 17.0.9+11-LTS-201
JDK 17.0.9

3. 查看启动参数

jcmd <pid> VM.command_line
用法
jcmd 970 VM.command_line
输出
Command line:  -Xmx2G -Xms1G -Dspring.profiles.active=prod -jar app.jar

4. 查看 JVM 参数(flags)

jcmd <pid> VM.flags
用法
jcmd 970 VM.flags
输出
-XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=2147483648 -XX:+UseG1GC

5. 打印线程堆栈(类似 jstack

jcmd <pid> Thread.print
用法
jcmd 970 Thread.print
输出

列出所有线程的栈信息,包括锁等待、阻塞等,非常适合死锁分析。

6. 强制触发 GC

jcmd <pid> GC.run
用法
jcmd 970 GC.run

此命令不会显示太多输出,但会触发一次完全 GC。

7. 获取堆信息(heap 使用情况)

jcmd <pid> GC.heap_info
用法
jcmd 970 GC.heap_info
输出
Heap Configuration:MinHeapFreeRatio         = 40MaxHeapFreeRatio         = 70...
Heap Usage:G1 Heap:regions  = 2048capacity = 2048Mused     = 1024Mfree     = 1024M

8. 导出 heap dump(堆快照)

jcmd <pid> GC.heap_dump /path/to/heapdump.hprof
用法
jcmd 970 GC.heap_dump /tmp/app-heap.hprof

文件可以用 MAT 或 VisualVM 分析。

9. 类直方图(类实例计数)

jcmd <pid> GC.class_histogram
用法
jcmd 970 GC.class_histogram
或者输出到文件
jcmd 970 GC.class_histogram > histogram.txt
输出
 num     #instances         #bytes  class name
----------------------------------------------1:        10000        1600000  [C2:         5000         800000  java.lang.String3:         3000         720000  java.util.HashMap

10. 导出类加载器信息

jcmd <pid> VM.class_loader_stats
用法
jcmd 970 VM.class_loader_stats
输出

统计各类加载器加载的类数量、占用内存等信息。

11. 检查是否发生了死锁

jcmd <pid> Thread.print
用法
jcmd 970 Thread.print

系统会显示哪些线程在等待锁、拥有锁,如果存在死锁,会提示 Found one Java-level deadlock.

12. 查看 Metaspace 使用情况

jcmd <pid> VM.native_memory summary
用法
jcmd 970 VM.native_memory summary

需要启动 JVM 时开启:

-XX:NativeMemoryTracking=summary

13. 查看系统属性(类似 System.getProperties)

jcmd <pid> VM.system_properties
用法
jcmd 970 VM.system_properties

14. 使用 Java Flight Recorder(JDK 11+)

JFR.start, JFR.dump, JFR.stop

# 启动 JFR
jcmd 970 JFR.start name=profile settings=profile duration=60s filename=/tmp/recording.jfr# 手动 dump
jcmd 970 JFR.dump name=profile filename=/tmp/manual.jfr# 停止 JFR
jcmd 970 JFR.stop name=profile

15. 查看 JIT 编译缓存区状态

jcmd <pid> Compiler.codecache
用法
jcmd 970 Compiler.codecache

四、常见场景使用

性能监控中查看当前内存使用情况

jcmd $(pidof java) GC.heap_info

导出内存快照进行 OOM 分析

jcmd $(pidof java) GC.heap_dump /tmp/dump-$(date +%s).hprof

分析线程死锁或阻塞线程

jcmd $(pidof java) Thread.print > /tmp/thread-dump.log

定时触发 GC 以排查内存回收异常

watch -n 60 "jcmd $(pidof java) GC.run"

Java 服务卡顿,想排查是否 GC 频繁

jcmd <pid> GC.heap_info
jcmd <pid> GC.class_histogram
jcmd <pid> GC.run
jcmd <pid> GC.class_histogram

比较前后对象数量是否减少,分析垃圾回收效率。

服务 CPU 飙高,定位是哪条线程

  1. 查看线程信息(找到耗 CPU 的线程)
top -Hp <pid>
  1. 将该线程 TID 转为十六进制(假设是 970 → 0x3039)
print "%x/n" <pid>
  1. jcmd 输出中查找栈
jcmd <pid> Thread.print | grep -A 20 0x3039

导出类实例占用查看内存增长

jcmd <pid> GC.class_histogram > before.txt
# 10分钟后
jcmd <pid> GC.class_histogram > after.txt
diff before.txt after.txt

分析 JVM 启动参数差异

jcmd <pid> VM.flags
jcmd <pid> VM.command_line

五、注意

  • jcmd 只能对当前用户启动的 Java 进程使用,或者以 root 权限运行。
  • 输出信息比较多,建议重定向到文件进行分析。
  • jstackjmap 等相比,jcmd 更统一、更高效。
功能命令
查看进程列表jcmd
查看支持命令jcmd <pid> help
JVM 版本jcmd <pid> VM.version
JVM 启动参数jcmd <pid> VM.command_line / VM.flags
手动 GCjcmd <pid> GC.run
打印线程堆栈jcmd <pid> Thread.print
类占用分析jcmd <pid> GC.class_histogram
原生内存jcmd <pid> VM.native_memory summary
启动/导出 JFRjcmd <pid> JFR.*

相关文章:

JVM之jcmd命令详解

jcmd 是 Oracle JDK&#xff08;Java Development Kit&#xff09;自 JDK 7 起引入的一个强大的诊断工具&#xff0c;用于与正在运行的 JVM&#xff08;Java Virtual Machine&#xff09;实例进行交互。它允许用户执行各种诊断命令&#xff0c;比如线程堆栈分析、堆转储、GC 信…...

Go语言:json 作用和语法

在 Go 语言中&#xff0c;JSON 字段&#xff08;也称为 JSON Tag&#xff09;是附加在结构体字段上的元数据&#xff0c;用于控制该字段在 JSON 编码&#xff08;序列化&#xff09;和解码&#xff08;反序列化&#xff09; 时的行为。它的语法是&#xff1a; type StructName…...

Hive HA配置高可用

Hive的高可用性(HA)通过消除关键组件的单点故障来实现,确保系统在部分故障时仍能正常运行。其基本原理涉及以下核心组件和策略: ‌1. Hive Metastore 的高可用‌ ‌ 多实例部署‌:部署多个Metastore服务实例,每个实例连接到共享的后端数据库(如MySQL、PostgreSQ…...

Ubuntu 第11章 网络管理_常用的网络配置命令

为了管理网络&#xff0c;Linux提供了许多非常有用的网络管理命令。利用这些命令&#xff0c;一方面可以有效地管理网络&#xff0c;另一方面出现网络故障时&#xff0c;可以快速进行诊断。本节将对Ubuntu提供的网络管理命令进行介绍。 11.2.1 ifconfig命令 关于ifconfig命令&…...

【Qt】Qt 构建系统详解:qmake 入门到项目实战

Qt 构建系统详解&#xff1a;qmake 入门到项目实战 本文将系统介绍 Qt 构建工具 qmake 的用法&#xff0c;并通过一个完整的项目结构示例&#xff0c;帮助你掌握 .pro 文件编写、子项目管理、模块依赖等核心技能。 &#x1f9ed; 一、什么是 qmake&#xff1f; qmake 是 Qt 提…...

Python实例题:pygame开发打飞机游戏

目录 Python实例题 题目 pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本 代码解释 初始化部分&#xff1a; 游戏主循环&#xff1a; 退出部分&#xff1a; 运行思路 注意事项 Python实例题 题目 pygame开发打飞机游戏 pygame-aircraft-game使用 Pygame 开发…...

《Zabbix Proxy分布式监控实战:从安装到配置全解析》

注意&#xff1a;实验所需的zabbix服务器的搭建可参考博客 zabbix 的docker安装_docker安装zabbix-CSDN博客 1.1 实验介绍 1.1.1 实验目的 本实验旨在搭建一个基于Zabbix的监控系统&#xff0c;通过安装和配置Zabbix Proxy、MySQL数据库以及Zabbix Agent&#xff0c;实现分…...

华为配置篇-RSTP/MSTP实验

MSTP 一、简介二、常用命令总结三、实验 一、简介 RSTP&#xff08;快速生成树协议&#xff09;​ RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09;是 STP 的改进版本&#xff0c;基于 ​​IEEE 802.1w 标准​​&#xff0c;核心目标是解决传统 STP 收敛速度慢的问…...

git如何将本地 dev 分支与远程 dev 分支同步

要让本地 dev 分支与远程 dev 分支完全同步&#xff08;丢弃本地多余的提交记录&#xff09;&#xff0c;可以按照以下步骤操作&#xff1a; 1. ​​获取远程最新状态​ git fetch origin dev # 拉取远程 dev 分支的最新提交&#xff0c;但不会修改本地代码 IDEA中点击fetc…...

使用Python和OpenCV实现实时人脸检测与识别

前言 在计算机视觉领域&#xff0c;人脸检测与识别是两个非常重要的任务。人脸检测是指在图像中定位人脸的位置&#xff0c;而人脸识别则是进一步识别出人脸的身份。随着深度学习的发展&#xff0c;这些任务的准确性和效率都有了显著提升。OpenCV是一个开源的计算机视觉库&…...

Unity基础学习(九)输入系统全解析:鼠标、键盘与轴控制

目录 一、Input类 1. 鼠标输入 2. 键盘输入 3. 默认轴输入 &#xff08;1&#xff09; 基础参数 &#xff08;2&#xff09;按键绑定参数 &#xff08;3&#xff09;输入响应参数 &#xff08;4&#xff09;输入类型与设备参数 &#xff08;5&#xff09;不同类型轴的参…...

QT:获取软件界面窗口的尺寸大小2025.5.8

在Windows系统中&#xff0c;获取软件界面窗口的尺寸大小可以通过多种方法实现&#xff0c;以下是基于不同场景的详细解决方案&#xff1a; 方法1&#xff1a;使用Windows API获取窗口尺寸 适用于获取外部应用程序窗口的尺寸&#xff08;如记事本、计算器等&#xff09;。 步…...

【ML-Agents】ML-Agents示例项目导入unity报错解决

最近在跑ML-Agents的示例代码&#xff0c;无奈往unity中导入项目后&#xff0c;就出现报错。本文简要描述了各个报错的解决方法。 文章目录 一、error CS0234: The type or namespace name InputSystem does not exist in the namespace UnityEngine (are you missing an assem…...

【网络安全】SQL注入

如果文章不足还请各位师傅批评指正&#xff01; 想象一下&#xff0c;你经营着一家咖啡店&#xff0c;顾客可以通过店内的点单系统下单。这个系统会根据顾客的输入&#xff0c;向后厨发送指令&#xff0c;比如“为顾客A准备一杯拿铁”。 然而&#xff0c;如果有个不怀好意的顾客…...

Transformer Decoder-Only 参数量计算

Transformer 的 Decoder-Only 架构&#xff08;如 GPT 系列模型&#xff09;是当前大语言模型的主流架构&#xff0c;其参数量主要由以下几个部分组成&#xff1a; 嵌入层&#xff08;Embedding Layer&#xff09;自注意力层&#xff08;Self-Attention Layers&#xff09;前馈…...

uni-app 中的条件编译与跨端兼容

uni-app 为了实现一套代码编译到多个平台&#xff08;包括小程序&#xff0c;App&#xff0c;H5 等&#xff09;&#xff0c;引入了条件编译机制。 通过条件编译&#xff0c;我们可以针对不同的平台编写特定的代码&#xff0c;从而实现跨端兼容。 一、条件编译的作用 平台差异…...

<C#>log4net 的配置文件配置项详细介绍

log4net 是一个功能强大的日志记录工具&#xff0c;通过配置文件可以灵活地控制日志的输出方式、格式、级别等。以下是对 log4net 配置文件常见配置项的详细介绍&#xff1a; 根元素 <log4net> 这是 log4net 配置文件的根元素&#xff0c;所有配置项都要包含在该元素内…...

excel单元格如果是日期格式,在C#读取的时候会变成45807,怎么处理

excel单元格如果是日期格式&#xff0c;在C#读取的时候会变成45807&#xff0c;怎么处理 excel单元格如果是日期格式&#xff0c;在C#读取的时候会变成45807&#xff0c;怎么处理 在 C# 中&#xff0c;Excel 日期被表示为一个数字&#xff0c;这是因为 Excel 内部将日期存储为…...

Unity接入SDK之修改Unity启动页面

原理就是在Android Studio新建Activity继承UnityPlayerActivity&#xff0c;然后再Unity中修改启动页面。 一&#xff0c;Android Studio篇 首先新建一个项目&#xff0c; 新建完成之后基于新建的项目新建一个module&#xff0c;选择为Android Library类型 新建的Library再目…...

yarn workspace使用指南

作用 Yarn workspace 是 Yarn 包管理工具中的一个功能&#xff0c;主要用于管理多包项目&#xff08;monorepo&#xff09;。它的主要作用如下&#xff1a; 支持多包结构&#xff1a;允许在一个仓库中管理多个独立的包或项目。项目间依赖管理&#xff1a;方便地在不同包之间添…...

[学习]RTKLib详解:datum.c、download.c与lambda.c

RTKLib详解: datum.c、download.c 与 lambda.c 本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详解&#xff…...

VUE el-select下拉框动态设置禁用,删除后恢复可选择

场景&#xff1a;点击新增添加按钮&#xff0c;列表table会新增一条包含下拉菜单的数据&#xff0c;如果其中任何一个下拉框选择了某个值&#xff0c;那么新增的下拉菜单的选项中该值是禁用状态&#xff0c;只能选择其他未被选中过的值。点击删除按钮后&#xff0c;已禁用的选项…...

FPGA----基于ALINX提供的debian实现TCF

引言:接上问,我们使用自制的image.ub和boot.bin以及ALINX提供的debian8根文件系统,构建了petalinux,但是经测试,该文件系统无法启用TCF服务,即无法与Xilinx SDK建立连接,那么我们应该如何解决? FPGA----基于ZYNQ 7020实现定制化的EPICS通信系统-CSDN博客文章浏览阅读4…...

木马查杀篇—Opcode提取

【前言】 介绍Opcode的提取方法&#xff0c;并探讨多种机器学习算法在Webshell检测中的应用&#xff0c;理解如何在实际项目中应用Opcode进行高效的Webshell检测。 Ⅰ 基本概念 Opcode&#xff1a;计算机指令的一部分&#xff0c;也叫字节码&#xff0c;一个php文件可以抽取出…...

1.7 方向导数

&#xff08;底层逻辑演进脉络&#xff09;从"单车道"到"全路网"的导数进化史&#xff1a; 一、偏导数奠基&#xff08;1.6核心&#xff09; 诞生背景&#xff1a;多元函数分析需求 当变量间存在耦合关系时&#xff08;如房价面积单价装修成本&#xff09…...

设计模式系列(01):总览与引导

设计模式系列(01):总览与引导 本文为设计模式系列第1篇,定位为总览和引导,系统梳理设计模式的核心思想、分类、UML、设计原则、典型场景、学习建议与常见误区,适合系统学习与团队协作。 目录 1. 前言2. 设计模式简介3. UML与设计模式4. 术语解释5. UML工具与PlantUML6. 面…...

国产化Excel处理控件Spire.XLS系列教程:如何通过 C# 删除 Excel 工作表中的筛选器

在 Excel 文件中&#xff0c;筛选器&#xff08;Filter&#xff09;是一个常用的数据处理工具&#xff0c;可以帮助用户快速按条件筛选数据行。但在数据整理完成、导出、共享或打印之前&#xff0c;往往需要 删除 Excel 工作表中的筛选器&#xff0c;移除列标题中的下拉筛选按钮…...

第二篇 客户端脚本安全

同源策略 限制了来自不同的"dociment"或脚本&#xff0c;对当前"dociment"读取或设置一些属性。 不同源&#xff1a;host&#xff08;域名或ip&#xff09;&#xff0c;子域名&#xff0c;端口&#xff0c;协议。 对于当前页面来说&#xff0c;页面的源…...

[sklearn] 特征工程

一.字典数据抽取 def dictvec():"""字典数据抽取:return: None"""# 实例化# sparse改为True,输出的是每个不为零位置的坐标&#xff0c;稀疏矩阵可以节省存储空间dict DictVectorizer(sparseFalse) #矩阵中存在大量的0&#xff0c;sparse存储只…...

CI/CD与DevOps流程流程简述(提供思路)

一 CI/CD流程详解&#xff1a;代码集成、测试与发布部署 引言 在软件开发的世界里&#xff0c;CI/CD&#xff08;持续集成/持续交付&#xff09;就像是一套精密的流水线&#xff0c;确保代码从开发到上线的整个过程高效、稳定。我作为一名资深的软件工程师&#xff0c;接下来…...