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

【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.flagsjcmd <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&#xff1a;列出正在运行的 Java 进程3.3 jcmd < pid> help&#xff1a;列出特定进程的诊断命令列表3.4 jcmd < pid> < command>&#xff1a;执行诊断命令 4️⃣ 应用场景…...

如何创建无序列表和有序列表?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 无序列表⭐ 无序列表⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴…...

【MongoDB】初识、安装MongoDB

目录 一、MongoDB主要应用场景 二、MongoDB简介 三、MongoDB相关特点 四、MongoDB的安装 一、MongoDB主要应用场景 传统的数据库如MySQL在应对三高场景时显得力不从心 三高&#xff1a; High performance 对数据库高并发读写的需求 High Storage 对海量数据的高效率存储和 …...

方法区内存溢出及常量池

22 方法区-定义 是所有线程共享的一块区域。 存储了和类结构相关信息。运行时常量池&#xff0c; 方法区在虚拟机启动时被创建&#xff0c;逻辑上是堆的组成部分。方法区内存不足&#xff0c;也会导致oom异常。 是一个概念上的东西&#xff0c; 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的功能等&#xff0c;欢迎下载最新版本体验&#xff01; DevExpress Dashboard v23.1正式版下载(Q技术交流&#xff1a;523159565&#xff09; 所有平台 导出自定义仪表板项目到Excel 用户现在可以在WinForms和Web应…...

分布式应用:ELK企业级日志分析系统

目录 一、理论 1.ELK 2.ELK场景 3.完整日志系统基本特征 4.ELK 的工作原理 5.ELK集群准备 6.Elasticsearch部署&#xff08;在Node1、Node2节点上操作&#xff09; 7.Logstash 部署&#xff08;在 Apache 节点上操作&#xff09; 8.Kiabana 部署&#xff08;在 Node1 节点…...

Mac与windows传文件(超过4G且速度超快,非共享)

MAC与Windows文件互传 背景 尝试了网上的一些方法&#xff0c;诸如设置共享文件夹方法等&#xff0c;但是实际使用中感觉效果一般&#xff0c;对于一些小的文件共同编辑速度还可以。但是在备份或者传递一些较大文件或者很多细小文件的时候就有点捉襟见肘了。制作了一个MAC可读…...

2023年第四届“华数杯”数学建模思路 - 案例:退火算法

## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&#xff0c;退火&#xff08;annealing&#xff09;现象指物体逐渐降温的物理现象&#xff0c;温度愈低&#…...

STM32 UDS Bootloader开发-上位机篇-CANoe制作(3)

文章目录 前言刷写脚本34服务写入数据的实现定时函数writeBlockData函数Checksum总结前言 上一篇文章中介绍了CAPL刷写脚本的大部分内容,本文继续介绍34,36,37服务的实现,及checksum中遇到的坑 刷写脚本 34服务 void requestDownLoad(struct Block hexfile) {gTxBuffer[…...

GO语言的垃圾回收机制

内存垃圾的产生 程序在内存上被分为堆区、栈区、全局数据区、代码段、数据区五个部分。对于C等早期编程语言栈上的内存回由编译器负责管理回收&#xff0c;而堆上的内存空间需要编程人员负责申请和释放。在Go中栈上内存仍由编译器负责管理回收&#xff0c;而堆上的内存由编译器…...

vim粘贴内容格式混乱解决方法

问题 复制本地文件内容后&#xff0c;咱贴到vim文本内&#xff0c;格式错乱 解决方法 打开vim配置文件 最后面加入一行 vim /etc/vimrc set pastetoggle<F11> 开发vim文件&#xff0c;进入后先按F11进入交互模式 shift insert 再次粘贴 解决...

基于Orangepi 3 lts 的云台相机

利用orangepi 3 lts 和arduino nano 制作了一个云台相机&#xff0c;可用于室内监控。 硬件&#xff1a; orangepi 3 ,arduino nano ,usb相机&#xff0c;180度舵机两个 WeChat_20230806213004 软件&#xff1a; 整体采用mqtt进行消息的中转。 相机采用python 利用opencv…...

Go重写Redis中间件 - Go实现Redis持久化

GO实现Redis持久化 项目开发到这里,我们的下一步就是实现Redis的持久化落盘功能,Redis是一个内存型的数据库,在之前我们实现的单机版Redis如果把进程杀掉,我们通过GET、SET指令存储的数据都将不复存在,数据只存在内存的map里面,重启之后什么都没有了 我们现在的目标就是…...

单元测试之 - Review一个微服务的单元测试

这里以github上一个microservice的demo代码为例&#xff0c;来看看如何为一个完整的服务编写单元测试。具体代码如下所示&#xff0c;我们重点查看一下catalog和customer&#xff0c;order中的单元测试有哪些。 首先来看catalog服务的单元测试,这个服务下面主要编写了CatalogWe…...

NetSuite 2023.2 Cash 360 功能更新

大约一年前&#xff0c;Cash 360功能推出。我们写了篇介绍&#xff1a; NetSuite Cash 360_netsuite oneworld数据可以迁移到sap上吗_NetSuite知识会的博客-CSDN博客Cash 360是在SuiteWorld 2021做的预告&#xff0c;本来是要跟着22.1发布出来&#xff0c;但是各种原因导致跳票…...

vue2-组件和插件的区别

1、组件是什么&#xff1f; 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念&#xff08;组件&#xff09;来实现开发的模式&#xff0c;在vue中每一个.vue文件都可以被视为一个组件。 组件的优势&#xff1a; 降低整个系统的耦合度&#xff0c;在保持接口不变的情况下…...

neo4j查询语言Cypher详解(一)--语法和子句

前言 neo4j的图查询语言叫Cypher。Cypher的独特之处在于它提供了一种匹配模式和关系的可视化方式。 (nodes)-[:ARE_CONNECTED_TO]->(otherNodes)使用圆角括号表示节点(nodes)&#xff0c; -[:ARROWS]->表示关系。 语法 解析 Cypher解析器接受任意输入字符串。 unico…...

PCIe总线详解

一、PCIe简介 PCI Express (peripheral component interconnect express) 简称PCIe&#xff0c;是一种高速、串行、全双工、计算机扩展总线标准&#xff0c;采用高速差分总线&#xff0c;并采用端到端的连接方式&#xff0c;因此在每一条PCIe链路中两端只能各连接一个设备。相对…...

【vim 学习系列文章 4 - vim与系统剪切板之间的交互】

文章目录 背景1.1.1 vim支持clipboard 检查1.1.2 vim的寄存器 上篇文章&#xff1a;【vim 学习系列文章 3 - vim 选中、删除、复制、修改引号或括号内的内容】 背景 从vim中拷贝些文字去其它地方粘贴&#xff0c;都需要用鼠标选中vim的文字后&#xff0c;Ctrlc、Ctrlv&#x…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...