【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 是最强大的内置工具。

相关推荐
码熔burning9 小时前
JVM 对象创建的核心流程!
java·jvm
我是廖志伟12 小时前
JVM新生代Eden区域深度解析
java·jvm·memory management
花城飞猪15 小时前
Android系统框架知识系列(二十):专题延伸:JVM vs ART/Dalvik - Android运行时演进深度解析
android·jvm·dalvik
Mr.朱鹏15 小时前
ShardingJDBC实战指南
java·jvm·数据库·spring·分库分表·shardingjdbc·shardingshere
星梦清河15 小时前
宋红康 JVM 笔记 Day16|垃圾回收相关概念
java·jvm·笔记
哈基米喜欢哈哈哈1 天前
ThreadLocal 内存泄露风险解析
java·jvm·面试
星梦清河1 天前
宋红康 JVM 笔记 Day15|垃圾回收相关算法
jvm·笔记·算法
BillKu2 天前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee
DKPT2 天前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习