【JVM】故障诊断和性能监控命令

王者杯·14天创作挑战营·第5期 10w+人浏览 1.2k人参与

一、故障诊断、监控和性能分析命令 (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 GC1. jstat -gcutil <pid> 1s 观察FGC/FGCT变化
2. 使用 jmapjcmd 生成堆转储,用 MATJVisualVM 分析内存泄漏
内存溢出 (OOM)在启动参数中添加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof,让JVM在发生OOM时自动生成堆转储
综合性能分析使用 jcmd 开启一段时间的 JFR 记录,然后用 JMC 进行深度分析

总结:对于日常开发,掌握 jps, jstack, jmap, jstatjcmd 就足以应对大部分问题。对于更复杂的性能调优,JFR 是最强大的内置工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值