【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…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
