【JVM】故障诊断和性能监控命令
这里写目录标题
- 一、故障诊断、监控和性能分析命令 (jcmd & Tools)
- 1. `jps` (JVM Process Status Tool)
- 2. `jinfo` (Configuration Info for Java)
- 3. `jstat` (JVM Statistics Monitoring Tool)
- 4. `jstack` (Stack Trace for Java)
- 5. `jmap` (Memory Map for Java)
- 6. `jcmd` (全能命令) - **推荐使用**
- 二、Java 飞行记录器 (JFR) 相关命令
- 1. 启动 JFR
- 2. dump / stop / check
- 3. 分析 JFR 文件
- 三、常用命令组合与实战场景
一、故障诊断、监控和性能分析命令 (jcmd & Tools)
这些是 jdk/bin/
目录下的工具,用于监控运行中的 JVM 或诊断问题。它们是诊断线上问题的利器。
1. jps
(JVM Process Status Tool)
列出当前用户的所有 Java 进程及其 PID 和主类名。
jps -l # 显示主类的完整包名
jps -m # 显示传递给 main 方法的参数
jps -v # 显示传递给 JVM 的参数
2. jinfo
(Configuration Info for Java)
查看和动态修改目标 JVM 的各项参数。
jinfo <pid> # 打印所有系统属性和VM参数
jinfo -flags <pid> # 打印所有VM标志
jinfo -sysprops <pid> # 打印所有系统属性
jinfo -flag <FlagName> <pid> # 查看某个特定标志的值
jinfo -flag [+|-]<FlagName> <pid> # 开启或关闭某个布尔型标志(仅支持可写的标志)
jinfo -flag <FlagName>=<value> <pid> # 设置某个标志的值
3. jstat
(JVM Statistics Monitoring Tool)
监控 JVM 的各种运行状态信息,尤其是 GC 和类加载。
# 语法:jstat -<option> <pid> [<interval> <count>]
jstat -gcutil <pid> 1s 5 # 每1秒查询一次GC情况,共5次。关键指标:O(老年代使用率)、P(元空间使用率)、YGC/YGCT(YoungGC次数/耗时)、FGC/FGCT(FullGC次数/耗时)
jstat -gc <pid> # 显示GC容量和实际使用大小
jstat -class <pid> # 显示类加载信息(加载/卸载数量)
4. jstack
(Stack Trace for Java)
生成 JVM 当前时刻的线程快照。主要用于定位线程停顿、死锁、死循环、请求外部资源耗时过长等问题。
jstack <pid> # 打印线程栈
jstack -l <pid> # 打印线程栈,同时显示锁的附加信息(常用于分析死锁)
jstack -F <pid> # 强制打印(当jstack无响应时使用)
# 通常用法:jstack <pid> > thread_dump.log
5. jmap
(Memory Map for Java)
生成堆转储快照(heap dump)或查看堆内存的详细信息。
jmap -heap <pid> # 显示堆概要信息(GC算法、堆配置、使用情况)
jmap -histo:live <pid> # 显示堆中对象的统计信息(存活对象),按大小排序
jmap -histo:live <pid> | head -20 # 查看前20个最大的对象# 生成堆转储文件(非常重要,用于内存泄漏分析)
jmap -dump:live,format=b,file=heap_dump.hprof <pid>
6. jcmd
(全能命令) - 推荐使用
一个强大的多功能工具,可以执行上述许多命令的功能。语法:jcmd <pid> <command>
jcmd <pid> help # 列出该进程支持的所有命令
jcmd <pid> VM.flags # 类似 jinfo -flags
jcmd <pid> VM.system_properties # 类似 jinfo -sysprops
jcmd <pid> VM.uptime # JVM运行时长
jcmd <pid> GC.class_histogram # 类似 jmap -histo
jcmd <pid> GC.heap_info # 显示堆信息
jcmd <pid> Thread.print # 类似 jstack
jcmd <pid> GC.run # 触发Full GC
jcmd <pid> JFR.start # 启动JFR记录
jcmd <pid> JFR.dump # 导出JFR记录
jcmd <pid> JFR.stop # 停止JFR记录# 生成堆转储(比jmap更方便)
jcmd <pid> GC.heap_dump filename=heap_dump.hprof
二、Java 飞行记录器 (JFR) 相关命令
JFR 是 Oracle JDK 自带的一款极其实用的性能分析和事件收集工具,对性能影响很小 (<1%)。
1. 启动 JFR
- 命令行启动应用时开启:
java -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr -jar myapp.jar
- 对运行中的进程开启 (使用
jcmd
):jcmd <pid> JFR.start duration=60s filename=myrecording.jfr jcmd <pid> JFR.start name=myrecording settings=profile delay=10s duration=2m filename=/tmp/recording.jfr
2. dump / stop / check
jcmd <pid> JFR.dump name=myrecording filename=output.jfr # 导出正在进行的记录
jcmd <pid> JFR.stop name=myrecording # 停止特定记录
jcmd <pid> JFR.check # 检查当前记录状态
3. 分析 JFR 文件
使用 Java Mission Control (JMC) 图形化工具打开 .jfr
文件进行分析。
三、常用命令组合与实战场景
场景 | 常用命令组合 |
---|---|
快速查看 Java 进程 | jps -l |
CPU 占用过高 | 1. top 找到高CPU的Java进程PID 2. top -Hp <pid> 找到高CPU的线程TID 3. 将TID转为16进制 printf "%x\n" <tid> 4. `jstack |
程序无响应/死锁 | jstack -l <pid> > stack.log (分析 stack.log 中的 deadlock 关键字) |
频繁 Full GC | 1. jstat -gcutil <pid> 1s 观察FGC/FGCT变化 2. 使用 jmap 或 jcmd 生成堆转储,用 MAT 或 JVisualVM 分析内存泄漏 |
内存溢出 (OOM) | 在启动参数中添加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof ,让JVM在发生OOM时自动生成堆转储 |
综合性能分析 | 使用 jcmd 开启一段时间的 JFR 记录,然后用 JMC 进行深度分析 |
总结:对于日常开发,掌握 jps
, jstack
, jmap
, jstat
和 jcmd
就足以应对大部分问题。对于更复杂的性能调优,JFR 是最强大的内置工具。