跳到主要内容 Java 性能监控工具:jcmd 命令详解 | 极客日志
Java java
Java 性能监控工具:jcmd 命令详解 JDK 自带命令行工具 jcmd。它整合了 jps、jstat、jmap、jstack、jinfo 功能,支持实时诊断、性能采集及 JVM 配置调整。内容涵盖基础用法、进程查询、JVM 信息查看、内存监控与分析(堆 Dump、类统计)、线程监控(线程 Dump、死锁排查)、GC 操作与统计、动态参数调整等。通过实例演示常用命令,对比传统工具优势,并提供常见问题处理建议,帮助开发者高效进行生产环境 JVM 问题排查。
指针猎手 发布于 2026/3/28 更新于 2026/4/17 6 浏览jcmd 是 JDK 自带的多功能命令行工具(JDK 7+ 内置,无需额外安装),整合了 jps、jstat、jmap、jstack、jinfo 等传统工具的核心功能,支持实时诊断、性能数据采集、JVM 配置调整 等操作,且通过 PID 或主类名定位目标 JVM 进程,使用更简洁、功能更全面。
一、jcmd 核心优势
功能整合 :替代 jps(进程查询)、jstat(性能统计)、jmap(内存快照)、jstack(线程 Dump)、jinfo(配置查询),减少工具切换成本;
无侵入性 :多数命令(如性能统计、配置查询)不影响 JVM 运行,仅部分命令(如内存 Dump)会短暂占用资源;
:可在线修改 JVM 可动态配置的参数(无需重启应用);
支持动态调整
跨平台 :Windows、Linux、macOS 通用,命令格式一致。
二、前置条件
安装 JDK(JRE 不含 jcmd,需确保 JDK 的 bin 目录加入系统环境变量);
执行 jcmd 的用户需与目标 JVM 进程的用户一致(或拥有管理员/root 权限);
目标 JVM 进程处于运行状态(仅对本地进程有效,远程进程需配合 JMX)。
三、基础用法 jcmd [选项] <PID|主类名> <命令> [命令参数]
<PID|主类名>:指定目标 JVM 进程(可用 jcmd -l 查看所有进程);
<命令>:jcmd 支持的具体操作(如查询进程、Dump 内存、查看线程等);
若省略 <PID|主类名> 和 <命令>,仅执行 jcmd,效果等同于 jps(列出所有本地 JVM 进程)。
四、常用命令详解
1. 查看本地所有 JVM 进程(替代 jps)
命令:
示例输出: 1234 com.alibaba.dubbo.container.Main
5678 org.springframework.boot.loader.JarLauncher
用途:快速定位目标应用的 PID(后续所有命令需依赖 PID)。
2. 查看 jcmd 支持的所有命令(帮助文档)
命令: jcmd <PID> help
jcmd <PID> help <命令>
示例:查看 PID=1234 支持的命令
输出核心分类(关键命令):
JVM 信息查询 :VM.version(JVM 版本)、VM.flags(JVM 参数)、VM.system_properties(系统属性);
性能监控 :GC.class_histogram(类实例统计)、GC.heap_info(堆内存信息)、Thread.print(线程 Dump);
数据采集 :GC.heap_dump(堆 Dump)、VM.capture_output(捕获应用输出);
动态调整 :VM.set_flag(修改 JVM 标志)、VM.print_flags_final(查看最终生效的参数)。
3. JVM 基础信息查询(替代 jinfo)
(1)查看 JVM 版本和启动时间 Java HotSpot (TM) 64 -Bit Server VM version 25.341 -b10
JDK version: 1.8 .0 _341-b10
JVM 启动时间:2025 -12 -01 T10:00 :00 +0800 (已运行 2 h 30 m)
(2)查看 JVM 启动参数(含默认值 + 自定义) jcmd <PID> VM.flags
jcmd <PID> VM.flags -all
jcmd <PID> VM.flags -long
-XX:InitialHeapSize =2147483648 (初始堆 2 G)
-XX:MaxHeapSize =4294967296 (最大堆 4 G)
-XX:+UseG1GC(使用 G1 垃圾收集器)
-XX:MetaspaceSize =134217728 (元空间初始 128 M)
(3)查看系统属性(替代 System.getProperties()) jcmd <PID> VM.system_properties
java.version =1.8 .0_341
user.home =/root
spring.profiles.active =prod(Spring Boot 环境)
file.encoding =UTF-8
4. 内存监控与分析(替代 jmap)
(1)查看堆内存整体信息 Heap Usage:
G1 Heap: regions = 2048 (G1 Region 数量)
capacity = 4294967296 bytes (4.0 GB)(堆总容量)
used = 1572864000 bytes (1.5 GB)(已使用)
free = 2722103296 bytes (2.5 GB)(空闲)
used 率 = 36.62%
Metaspace: capacity = 1610612736 bytes (1.5 GB)(元空间容量)
used = 858993456 bytes (819.2 MB)(已使用)
free = 751619280 bytes (704.8 MB)(空闲)
用途:快速判断堆/元空间是否溢出、使用率是否异常。
(2)生成堆 Dump(内存快照,用于分析内存泄漏) jcmd <PID> GC.heap_dump <输出路径>
jcmd <PID> GC.heap_dump <输出路径> -all
示例:生成 PID=1234 的堆 Dump 到 /tmp 目录
jcmd 1234 GC.heap_dump /tmp/app_heap_dump.hprof
注意:
生成过程中 JVM 会短暂停顿(STW),建议在低峰期执行;
快照文件较大(接近堆使用量),确保磁盘有足够空间;
后续可通过 MAT(Memory Analyzer Tool)或 JProfiler 分析快照。
(3)查看类实例统计(按内存占用排序) jcmd <PID> GC.class_histogram
jcmd <PID> GC.class_histogram > /tmp/class_histogram.txt
num
----------------------------------------------
1: 85623 123456784 java.lang.String(字符串实例最多)
2: 32456 98765432 java.util.HashMap$Node(HashMap 节点)
3: 15678 76543210 com.alibaba.fastjson.JSONObject(业务类)
用途:快速定位内存占用 Top 的类(如大量重复字符串、未释放的集合)。
5. 线程监控与分析(替代 jstack)
(1)生成线程 Dump(查看线程状态、死锁等) jcmd <PID> Thread.print
jcmd <PID> Thread.print -l
jcmd <PID> Thread.print > /tmp/thread_dump.txt
2025 -12 -02 14 :30 :00 Full thread dump Java HotSpot (TM) 64 -Bit Server VM (25.341 -b10 mixed mode):
"http-nio-8080-exec-1"
java.lang.Thread.State: RUNNABLE(运行中)
at sun.nio.ch.EPollArrayWrapper.epollWait (Native Method)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor .doRun (NioEndpoint.java :1742 )
"DubboServerHandler-192.168.1.1:20880-thread-5"
java.lang.Thread.State: BLOCKED (on object monitor)(阻塞,等待锁)
at com.example.service.UserService.queryUser (UserService.java :45 )
- waiting to lock <0x0000000765432100 > (a com.example.service.UserService)
"GC Thread#0"
核心用途:
排查死锁(输出中会明确标记 Found one Java-level deadlock);
定位线程阻塞(BLOCKED 状态)、等待(WAITING/TIMED_WAITING)的原因;
分析线程池是否耗尽(如 Tomcat 线程池所有线程处于 RUNNABLE 且长时间不释放)。
6. GC 相关操作与监控(替代 jstat)
(1)触发一次 Full GC(测试/应急场景) jcmd <PID> GC.run
jcmd <PID> GC.run_finalization
注意:
不建议生产环境频繁执行(Full GC 会导致 STW,影响性能);
仅用于应急(如内存占用过高需快速释放)或测试场景。
(2)查看 GC 详细统计信息 jcmd <PID> GC.statistics
jcmd <PID> GC.statistics -all
GC Statistics:
G1 Young Generation:
Collections: 123 (Young GC 次数)
Total Time: 456ms(总耗时)
Avg Time: 3. 7ms(平均耗时)
G1 Old Generation:
Collections: 5 (Full GC 次数)
Total Time: 789ms(总耗时)
Avg Time: 157. 8ms(平均耗时)
Heap After Last GC: 1. 2GB(最后一次 GC 后堆使用量)
用途:分析 GC 频率、耗时是否正常(如 Full GC 频繁可能是内存泄漏或参数不合理)。
7. 动态调整 JVM 参数(无需重启应用) jcmd 支持修改 JVM 中标记为可动态调整 的参数(通过 VM.flags -all 可查看参数是否支持 dynamic)。
命令格式: jcmd <PID> VM.set_flag <参数名> <值>
常用场景示例:
调整 G1 GC 的最大停顿时间目标(默认 200ms):
jcmd 1234 VM.set_flag MaxGCPauseMillis 100
jcmd 1234 VM.set_flag PrintGCDetails true
jcmd 1234 VM.set_flag PrintGCTimeStamps true
jcmd 1234 VM.set_flag GCLogFileSize 100m
jcmd 1234 VM.set_flag NumberOfGCLogFiles 10
jcmd 1234 VM.set_flag LogFile /tmp/gc.log
jcmd 1234 VM.set_flag MaxMetaspaceSize 2g
注意:
不可动态调整的参数(如 -Xms、-Xmx 初始/最大堆)修改会报错;
修改前建议先通过 VM.flags 查看当前值,避免参数冲突。
五、常见问题与注意事项
权限不足 :执行 jcmd 时提示 Permission denied,需切换到目标进程的用户(如 sudo -u appuser jcmd);
进程未找到 :提示 No such process,可能是 PID 错误(用 jcmd -l 重新确认)或进程已退出;
命令不支持 :部分命令(如 GC.heap_dump)在低版本 JDK(<7u40)可能不支持,建议升级 JDK;
性能影响 :生成堆 Dump、线程 Dump 时会触发 STW(停顿时间与堆大小/线程数正相关),生产环境需避开高峰;
日志过大 :动态开启 GC 日志后,需定期清理日志文件,避免磁盘占满。
六、jcmd 与传统工具对比 功能场景 传统工具 jcmd 替代命令 优势 查看本地 JVM 进程 jps jcmd / jcmd -l 无需额外工具,输出更详细 查看 JVM 参数/系统属性 jinfo VM.flags / VM.system_properties 整合功能,支持过滤 生成堆 Dump/类统计 jmap GC.heap_dump / GC.class_histogram 命令更简洁,支持输出优化 生成线程 Dump jstack Thread.print 支持锁信息详情 动态调整 JVM 参数 无(需重启) VM.set_flag 无需重启,快速应急 GC 统计与触发 jstat / jmap -histo GC.statistics / GC.run 实时输出,无需指定间隔
总结 jcmd 是 Java 性能监控与诊断的'瑞士军刀',整合了传统工具的核心能力,且支持动态调整参数,是生产环境排查问题(内存泄漏、线程阻塞、GC 异常)的首选工具。掌握其常用命令(进程查询、内存 Dump、线程分析、参数调整),可大幅提升问题排查效率,无需依赖第三方工具即可完成大部分 JVM 监控需求。
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online