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

这里写目录标题

      • 一、故障诊断、监控和性能分析命令 (jcmd & Tools)
        • [1. `jps` (JVM Process Status Tool)](#1. jps (JVM Process Status Tool))
        • [2. `jinfo` (Configuration Info for Java)](#2. jinfo (Configuration Info for Java))
        • [3. `jstat` (JVM Statistics Monitoring Tool)](#3. jstat (JVM Statistics Monitoring Tool))
        • [4. `jstack` (Stack Trace for Java)](#4. jstack (Stack Trace for Java))
        • [5. `jmap` (Memory Map for Java)](#5. jmap (Memory Map for Java))
        • [6. `jcmd` (全能命令) - **推荐使用**](#6. jcmd (全能命令) - 推荐使用)
      • [二、Java 飞行记录器 (JFR) 相关命令](#二、Java 飞行记录器 (JFR) 相关命令)
        • [1. 启动 JFR](#1. 启动 JFR)
        • [2. dump / stop / check](#2. dump / stop / check)
        • [3. 分析 JFR 文件](#3. 分析 JFR 文件)
      • 三、常用命令组合与实战场景

一、故障诊断、监控和性能分析命令 (jcmd & Tools)

这些是 jdk/bin/ 目录下的工具,用于监控运行中的 JVM 或诊断问题。它们是诊断线上问题的利器

1. jps (JVM Process Status Tool)

列出当前用户的所有 Java 进程及其 PID 和主类名。

bash 复制代码
jps -l      # 显示主类的完整包名
jps -m      # 显示传递给 main 方法的参数
jps -v      # 显示传递给 JVM 的参数
2. jinfo (Configuration Info for Java)

查看和动态修改目标 JVM 的各项参数。

bash 复制代码
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 和类加载。

bash 复制代码
# 语法: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 当前时刻的线程快照。主要用于定位线程停顿、死锁、死循环、请求外部资源耗时过长等问题。

bash 复制代码
jstack <pid>                    # 打印线程栈
jstack -l <pid>                 # 打印线程栈,同时显示锁的附加信息(常用于分析死锁)
jstack -F <pid>                 # 强制打印(当jstack无响应时使用)
# 通常用法:jstack <pid> > thread_dump.log
5. jmap (Memory Map for Java)

生成堆转储快照(heap dump)或查看堆内存的详细信息。

bash 复制代码
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>

bash 复制代码
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
  • 命令行启动应用时开启

    bash 复制代码
    java -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr -jar myapp.jar
  • 对运行中的进程开启 (使用 jcmd):

    bash 复制代码
    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
bash 复制代码
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. 使用 jmapjcmd 生成堆转储,用 MATJVisualVM 分析内存泄漏
内存溢出 (OOM) 在启动参数中添加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof,让JVM在发生OOM时自动生成堆转储
综合性能分析 使用 jcmd 开启一段时间的 JFR 记录,然后用 JMC 进行深度分析

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

相关推荐
讓丄帝愛伱24 分钟前
Arthas & JVM 性能排查
linux·jvm
铅笔侠_小龙虾1 天前
JVM深入研究--JHSDB (jvm 分析工具)
java·开发语言·jvm
码码哈哈0.02 天前
从“类加载的五个阶段”逐步分析 JVM“ 在每个阶段的内存变化”
jvm
寻星探路2 天前
Java EE初阶启程记04---线程的状态
java·开发语言·jvm·java-ee
wshzrf3 天前
【Java系列课程·Java学前须知】第3课 JDK,JVM,JRE的区别和优缺
java·开发语言·jvm
铅笔侠_小龙虾3 天前
JVM 深入研究 -- 详解class 文件
java·开发语言·jvm
Just_Do_IT_OK3 天前
线上JVM问题定位常用命令
jvm
DKPT3 天前
JVM栈溢出时如何dump栈信息?
java·jvm·笔记·学习·spring
DKPT3 天前
JVM堆大小如何设置?
java·开发语言·jvm·笔记·学习
铅笔侠_小龙虾3 天前
JVM 目录
java·jvm