jcmd-jvm
·
jcmd 命令详解
什么是 jcmd
jcmd 是 JDK 7 引入的一个命令行工具,用于向正在运行的 JVM 发送诊断命令。它是一个功能强大的工具,整合了之前多个 JVM 工具(如 jstack、jinfo、jmap 等)的功能,提供了统一的接口来管理和监控 Java 应用程序。
基本语法
jcmd [<pid>|<main class>] <command> [<arguments>]
<pid>: Java 进程的进程 ID<main class>: 主类名(如果有多个相同主类的进程,会提示选择)<command>: 要执行的诊断命令<arguments>: 命令参数
常用命令
1. 列出所有可用命令
jcmd <pid> help
2. 查看 JVM 进程列表
jcmd
3. 线程相关命令
3.1 生成线程转储(类似 jstack)
jcmd <pid> Thread.print
3.2 查看线程统计信息
jcmd <pid> Thread.print -l
4. 内存相关命令
4.1 生成堆转储(类似 jmap -dump)
jcmd <pid> GC.heap_dump <文件路径>
4.2 查看堆使用情况
jcmd <pid> GC.heap_info
4.3 触发垃圾回收
jcmd <pid> GC.run
5. 类加载相关命令
5.1 查看类加载统计
jcmd <pid> GC.class_stats
5.2 查看已加载的类
jcmd <pid> Class.loaded
6. JVM 信息相关命令
6.1 查看 JVM 系统属性
jcmd <pid> VM.system_properties
6.2 查看 JVM 命令行参数
jcmd <pid> VM.command_line
6.3 查看 JVM 版本信息
jcmd <pid> VM.version
6.4 查看 JVM 运行时信息
jcmd <pid> VM.info
7. 性能相关命令
7.1 查看编译统计
jcmd <pid> Compiler.codelist
7.2 查看 JIT 编译统计
jcmd <pid> Compiler.statistics
8. 其他常用命令
8.1 查看应用程序的 MBean
jcmd <pid> ManagementAgent.status
8.2 启动 JMX 代理
jcmd <pid> ManagementAgent.start_local
高级用法
1. 批量执行命令
jcmd <pid> help <command>
2. 使用文件输入命令
jcmd <pid> < <命令文件>
3. 监控多个进程
jcmd -l | xargs -I {} jcmd {} VM.info
实用场景
1. 排查性能问题
- 使用
Thread.print查看线程状态,识别死锁或阻塞 - 使用
GC.heap_dump生成堆转储,分析内存泄漏 - 使用
GC.heap_info查看堆使用情况,了解内存分配
2. 监控应用状态
- 使用
VM.system_properties查看系统属性 - 使用
VM.command_line查看启动参数 - 使用
Class.loaded查看类加载情况
3. 调试问题
- 使用
GC.run手动触发垃圾回收,观察内存变化 - 使用
Compiler.statistics分析 JIT 编译情况 - 使用
ManagementAgent.start_local启动 JMX 代理,进行远程监控
注意事项
- 权限问题:执行 jcmd 命令需要与目标 Java 进程相同的用户权限
- 性能影响:某些命令(如 heap_dump)可能会对应用性能造成短暂影响
- 版本兼容性:不同 JDK 版本的 jcmd 命令可能略有差异
- 输出大小:某些命令(如 Thread.print)的输出可能会非常大,建议重定向到文件
示例
示例 1:查看进程列表
jcmd
输出:
12345 com.example.Application
67890 org.springframework.boot.SpringApplication
示例 2:生成线程转储
jcmd 12345 Thread.print > thread_dump.txt
示例 3:生成堆转储
jcmd 12345 GC.heap_dump heap_dump.hprof
示例 4:查看 JVM 信息
jcmd 12345 VM.info
总结
jcmd 是一个功能强大的 JVM 诊断工具,它整合了多个传统 JVM 工具的功能,提供了统一的接口来管理和监控 Java 应用程序。通过 jcmd,开发者可以方便地执行各种诊断命令,排查性能问题,监控应用状态,调试问题等。
使用 jcmd 命令时,需要注意权限问题和性能影响,选择合适的命令来达到诊断目的。熟练掌握 jcmd 的使用,对于 Java 应用的开发、测试和生产环境的维护都非常有帮助。
更多推荐




所有评论(0)