【Java可执行命令】(十六)诊断命令请求发送工具 jcmd:提供一种简单而强大的方式来管理和监控 Java 进程 ~
Java可执行命令之jcmd
- 1️⃣ 概念
- 2️⃣ 优势和缺点
- 3️⃣ 使用
- 3.1 语法格式
- 3.2 jcmd -l:列出正在运行的 Java 进程
- 3.3 jcmd < pid> help:列出特定进程的诊断命令列表
- 3.4 jcmd < pid> < command>:执行诊断命令
- 4️⃣ 应用场景
- 🌾 总结

1️⃣ 概念
jcmd 是 Java 中用于与正在运行的 Java 进程进行交互的命令行工具。它旨在提供一种简单而强大的方式来管理和监控 Java 进程,以满足开发、调试和性能优化等需求。
jcmd 的核心概念是通过命令行发送指令给正在运行的 Java 进程,这些指令称为诊断命令(Diagnostic Command)。诊断命令可以执行各种操作,例如生成线程转储、查看堆内存使用情况、触发 GC、打印系统属性等。
jcmd 的实现原理涉及与 Java 进程的通信机制。具体来说,它利用了 Java 中的诊断功能(Diagnostic API),这个API提供了一组用于监控和管理 Java 进程的接口。通过 jcmd 命令发送到某个 Java 进程的指令会被转发给该进程的诊断代理,然后由代理执行相应的诊断命令。
2️⃣ 优势和缺点
优点:
- 方便管理:通过 jcmd 命令,可以在不停止进程的情况下对 Java 应用程序进行管理和监控;
- 强大功能:提供了丰富的诊断命令,可以获取详细的应用程序信息、捕获堆转储、动态修改虚拟机参数等;
- 简单易用:通过命令行的方式,使用相对简单,不需要额外的代码修改或依赖库。
缺点:
- 需要访问权限:使用 jcmd 进行诊断和控制某个 Java 进程需要适当的访问权限;
- 不支持远程应用程序:仅支持与本地 Java 进程进行交互,不支持与远程应用程序通信。
3️⃣ 使用
3.1 语法格式
jcmd 命令的使用语法如下:
jcmd <pid|main class> <command> [<command arguments>]
其中,<pid|main class> 可以指定要操作的 Java 进程ID或主类名。 <command> 是预定义的诊断命令名称,而 <command arguments> 则是可选的参数。
要注意的是,命令必须是所选 jvm 的有效 jcmd命令。可以使用命令“help”查看哪些命令可用。
如果指定 pid 为0,则将向所有Java进程发送命令。
主类参数将用于匹配(部分或完全)用于启动Java的类。如果没有给出任何选项,则列出Java进程(与-p相同)。
总的来说,jcmd 命令有以下常见的用法:
jcmd -l:列出正在运行的 Java 进程;jcmd <pid> help:列出特定进程的诊断命令列表;jcmd <pid> <command>:执行诊断命令;jcmd <pid> GC.heap_info:查看堆内存使用情况;jcmd <pid> GC.run:触发GC;jcmd <pid> Thread.print:打印线程堆栈跟踪。
下面我们逐一详细介绍。
而同时需要注意的是,使用 jcmd 进行诊断和控制某个 Java 进程需要适当的访问权限。如果无法访问指定进程,则可能需要使用管理员权限或其他特权用户进行操作。
并且由于 jcmd 允许对运行中的 Java 进程执行敏感操作,因此在部署和使用 jcmd 时需谨慎,确保只有受信任的用户能够访问。
3.2 jcmd -l:列出正在运行的 Java 进程
jcmd -l 是一个用于列出正在运行的 Java 进程的命令。使用 jcmd -l 命令时,它会扫描当前系统中的所有 Java 进程,并返回每个进程的进程 ID(PID)和启动类的主类名。这对于确定正在运行的 Java 进程及其相关信息非常有用。
例如,下面是 jcmd -l 的示例输出:
1234 com.example.Main
5678 org.myapp.Application
上述输出表示有两个 Java 进程正在运行:进程 ID 为 1234 的进程在使用 com.example.Main 类作为入口点,进程 ID 为 5678 的进程在使用 org.myapp.Application 类作为入口点。
jcmd -l 不提供任何关于进程的详细信息,它只给出了进程的基本信息。如果需要更多有关特定 Java 进程的信息,可以使用其他命令,如 jcmd <pid> VM.flags 或 jcmd <pid> Thread.print。
3.3 jcmd < pid> help:列出特定进程的诊断命令列表
jcmd <pid> help 是一个用于列出特定进程的诊断命令列表的命令。当我们知道某个 Java 进程的进程 ID(PID)时,可以使用 jcmd <pid> help 命令来获取该进程所支持的所有诊断命令的列表。
例如,假设我们要获取进程 ID 为 118472 的 Java 进程的诊断命令列表,我们可以运行以下命令:
jcmd 118472 help
执行该命令后,会返回类似下面的输出:
118472:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
VM.classloader_stats
GC.rotate_log
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
上述输出表示进程 ID 为 118472 的 Java 进程支持的一些诊断命令列表。可以从中选择特定的命令来查看和调试该进程的不同方面,如打印线程信息、监视内存使用情况等。
注意,可用的诊断命令列表取决于安装的 JDK 版本和 JVM 配置。因此,不同的 Java 版本可能会提供不同的命令集。
以下列出一些常见的 Java 诊断命令以及它们的作用。这些命令可以帮助进行 JVM 监控、故障排除和性能分析等工作。注意,不同的命令可能需要不同的参数和选项来完成更具体的任务。
| 命令 | 作用 |
|---|---|
| JFR.stop | 停止 Java Flight Recorder(JFR)事件录制 |
| JFR.start | 开始 Java Flight Recorder(JFR)事件录制 |
| JFR.dump | 将已录制的 JFR 事件转储到文件中 |
| JFR.check | 检查当前 JFR 事件录制的状态和设置 |
| VM.native_memory | 显示某个 Java 进程的本地内存使用情况 |
| VM.check_commercial_features | 检查是否启用了商业特性 |
| VM.unlock_commercial_features | 解锁并完全启用已启用的商业特性 |
| ManagementAgent.stop | 停止 Java 管理代理 |
| ManagementAgent.start_local | 启动一个本地连接的 Java 管理代理 |
| ManagementAgent.start | 启动一个远程连接的 Java 管理代理 |
| VM.classloader_stats | 输出关于类加载器统计信息的摘要 |
| GC.rotate_log | 手动旋转 GC 日志文件 |
| Thread.print | 打印当前 Java 进程中的线程堆栈信息 |
| GC.class_stats | 显示在堆中加载和卸载类的统计信息 |
| GC.class_histogram | 显示在堆上存在的对象数目,按类进行分类 |
| GC.heap_dump | 导出当前堆的快照为一个 HPROF 文件 |
| GC.finalizer_info | 显示等待终结器队列中对象的信息 |
| GC.heap_info | 显示当前堆的概要信息 |
| GC.run_finalization | 运行所有已注册但尚未运行的 finalize() 方法 |
| GC.run | 强制进行一次垃圾回收 |
| VM.uptime | 显示 JVM 的总运行时间 |
| VM.dynlibs | 列出当前虚拟机加载的动态链接库信息 |
| VM.flags | 显示正在使用的 JVM 标志参数 |
| VM.system_properties | 显示 Java 系统属性 |
| VM.command_line | 显示 Java 虚拟机的启动命令行参数 |
| VM.version | 显示正在使用的 Java 虚拟机版本信息 |
大家也可以参考相应的文档或使用命令的帮助选项来获取更多详细信息。
3.4 jcmd < pid> < command>:执行诊断命令
jcmd <pid> <command> 是一个用于执行特定进程的诊断命令的命令。
当我们知道某个 Java 进程的进程 ID(PID)以及要执行的诊断命令时,可以使用 jcmd <pid> <command> 命令来执行该进程的诊断命令。
例如,假设我们要执行进程 ID 为 1234 的 Java 进程的命令 GC.class_stats,我们可以运行以下命令:
jcmd 1234 GC.class_stats
执行该命令后,它会向该进程发送相应的命令,并获取并显示与 GC.class_stats 相关的统计信息。
不同的诊断命令可能会有不同的输出或操作。可以根据需求选择适当的命令以及其他可能需要的参数和选项。注意,要成功执行诊断命令,确保拥有足够的权限来操作目标进程。
4️⃣ 应用场景
- 分析和调试:用于获取运行中 Java 进程的信息、线程状态和堆转储等,以进行并发分析和代码调试;
- 性能监控和优化:观察堆内存使用情况、GC活动、CPU消耗等指标,从而帮助进行性能调优和排查性能问题;
- 运维和监控:与其他工具或脚本集成,用于自动化管理和监控 Java 进程,以实现自动化运维和健壮的监控系统。
🌾 总结
jcmd 是一个强大且方便的命令行工具,用于与正在运行的 Java 进程进行交互、管理和监控。通过它,可以执行各种诊断命令以了解应用程序的状态,进行调试和性能优化,并提供简洁易用的命令行界面。然而,在使用 jcmd 时需要注意安全性问题,并且目前仅支持本地 Java 进程的操作。无论是开发人员还是运维人员,都可以从 jcmd 中获益,并提高对 Java 应用程序的管理和监控能力。
相关文章:
【Java可执行命令】(十六)诊断命令请求发送工具 jcmd:提供一种简单而强大的方式来管理和监控 Java 进程 ~
Java可执行命令之jcmd 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 jcmd -l:列出正在运行的 Java 进程3.3 jcmd < pid> help:列出特定进程的诊断命令列表3.4 jcmd < pid> < command>:执行诊断命令 4️⃣ 应用场景…...
如何创建无序列表和有序列表?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 无序列表⭐ 无序列表⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴…...
【MongoDB】初识、安装MongoDB
目录 一、MongoDB主要应用场景 二、MongoDB简介 三、MongoDB相关特点 四、MongoDB的安装 一、MongoDB主要应用场景 传统的数据库如MySQL在应对三高场景时显得力不从心 三高: High performance 对数据库高并发读写的需求 High Storage 对海量数据的高效率存储和 …...
方法区内存溢出及常量池
22 方法区-定义 是所有线程共享的一块区域。 存储了和类结构相关信息。运行时常量池, 方法区在虚拟机启动时被创建,逻辑上是堆的组成部分。方法区内存不足,也会导致oom异常。 是一个概念上的东西, 1.6使用永久代作为方法区&#…...
【MTK平台】【wpa_supplicant】关于wpa_supplicant_8/src/p2p/p2p_invitation.c文件的介绍
本文主要介绍external/wpa_supplicant_8/src/p2p/p2p_invitation.c文件 这里主要介绍6个方法 1.p2p_invite //p2p邀请调用此方法 2.p2p_invite_send //对p2p_invite方法进行补充 3. p2p_process_invitation_resp 4.p2p_process_invitation_req 5.p2p_build_invitation_re…...
智能仪表板DevExpress Dashboard v23.1亮点 - 增强对自定义导出的支持
DevExpress Dashboard v23.1版本增强了自定义导出到Excel的功能等,欢迎下载最新版本体验! DevExpress Dashboard v23.1正式版下载(Q技术交流:523159565) 所有平台 导出自定义仪表板项目到Excel 用户现在可以在WinForms和Web应…...
分布式应用:ELK企业级日志分析系统
目录 一、理论 1.ELK 2.ELK场景 3.完整日志系统基本特征 4.ELK 的工作原理 5.ELK集群准备 6.Elasticsearch部署(在Node1、Node2节点上操作) 7.Logstash 部署(在 Apache 节点上操作) 8.Kiabana 部署(在 Node1 节点…...
Mac与windows传文件(超过4G且速度超快,非共享)
MAC与Windows文件互传 背景 尝试了网上的一些方法,诸如设置共享文件夹方法等,但是实际使用中感觉效果一般,对于一些小的文件共同编辑速度还可以。但是在备份或者传递一些较大文件或者很多细小文件的时候就有点捉襟见肘了。制作了一个MAC可读…...
2023年第四届“华数杯”数学建模思路 - 案例:退火算法
## 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上,退火(annealing)现象指物体逐渐降温的物理现象,温度愈低&#…...
STM32 UDS Bootloader开发-上位机篇-CANoe制作(3)
文章目录 前言刷写脚本34服务写入数据的实现定时函数writeBlockData函数Checksum总结前言 上一篇文章中介绍了CAPL刷写脚本的大部分内容,本文继续介绍34,36,37服务的实现,及checksum中遇到的坑 刷写脚本 34服务 void requestDownLoad(struct Block hexfile) {gTxBuffer[…...
GO语言的垃圾回收机制
内存垃圾的产生 程序在内存上被分为堆区、栈区、全局数据区、代码段、数据区五个部分。对于C等早期编程语言栈上的内存回由编译器负责管理回收,而堆上的内存空间需要编程人员负责申请和释放。在Go中栈上内存仍由编译器负责管理回收,而堆上的内存由编译器…...
vim粘贴内容格式混乱解决方法
问题 复制本地文件内容后,咱贴到vim文本内,格式错乱 解决方法 打开vim配置文件 最后面加入一行 vim /etc/vimrc set pastetoggle<F11> 开发vim文件,进入后先按F11进入交互模式 shift insert 再次粘贴 解决...
基于Orangepi 3 lts 的云台相机
利用orangepi 3 lts 和arduino nano 制作了一个云台相机,可用于室内监控。 硬件: orangepi 3 ,arduino nano ,usb相机,180度舵机两个 WeChat_20230806213004 软件: 整体采用mqtt进行消息的中转。 相机采用python 利用opencv…...
Go重写Redis中间件 - Go实现Redis持久化
GO实现Redis持久化 项目开发到这里,我们的下一步就是实现Redis的持久化落盘功能,Redis是一个内存型的数据库,在之前我们实现的单机版Redis如果把进程杀掉,我们通过GET、SET指令存储的数据都将不复存在,数据只存在内存的map里面,重启之后什么都没有了 我们现在的目标就是…...
单元测试之 - Review一个微服务的单元测试
这里以github上一个microservice的demo代码为例,来看看如何为一个完整的服务编写单元测试。具体代码如下所示,我们重点查看一下catalog和customer,order中的单元测试有哪些。 首先来看catalog服务的单元测试,这个服务下面主要编写了CatalogWe…...
NetSuite 2023.2 Cash 360 功能更新
大约一年前,Cash 360功能推出。我们写了篇介绍: NetSuite Cash 360_netsuite oneworld数据可以迁移到sap上吗_NetSuite知识会的博客-CSDN博客Cash 360是在SuiteWorld 2021做的预告,本来是要跟着22.1发布出来,但是各种原因导致跳票…...
vue2-组件和插件的区别
1、组件是什么? 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式,在vue中每一个.vue文件都可以被视为一个组件。 组件的优势: 降低整个系统的耦合度,在保持接口不变的情况下…...
neo4j查询语言Cypher详解(一)--语法和子句
前言 neo4j的图查询语言叫Cypher。Cypher的独特之处在于它提供了一种匹配模式和关系的可视化方式。 (nodes)-[:ARE_CONNECTED_TO]->(otherNodes)使用圆角括号表示节点(nodes), -[:ARROWS]->表示关系。 语法 解析 Cypher解析器接受任意输入字符串。 unico…...
PCIe总线详解
一、PCIe简介 PCI Express (peripheral component interconnect express) 简称PCIe,是一种高速、串行、全双工、计算机扩展总线标准,采用高速差分总线,并采用端到端的连接方式,因此在每一条PCIe链路中两端只能各连接一个设备。相对…...
【vim 学习系列文章 4 - vim与系统剪切板之间的交互】
文章目录 背景1.1.1 vim支持clipboard 检查1.1.2 vim的寄存器 上篇文章:【vim 学习系列文章 3 - vim 选中、删除、复制、修改引号或括号内的内容】 背景 从vim中拷贝些文字去其它地方粘贴,都需要用鼠标选中vim的文字后,Ctrlc、Ctrlv&#x…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
