Skip to content

jps/jstat/jinfo/jmap/jhat 命令

JDK 命令行工具:一线诊断利器

JVM 自带了一系列命令行诊断工具,部署在 $JAVA_HOME/bin 目录下。它们是排查问题的第一线武器——轻量、快速、不需要额外安装。

这一节详细介绍 jpsjstatjinfojmapjhat 五个工具。

jps:查看 Java 进程

基本用法

jps 是 JVM 进程状态工具,类似于 Linux 的 ps,但只显示 Java 相关进程:

bash
jps [options] [hostid]

常用选项

bash
# 查看所有 Java 进程
jps

# 输出:
# 12345 Jps
# 67890 Application
# 11111 Bootstrap

# 查看完整类名和参数
jps -l

# 输出:
# 12345 sun.tools.jdk.jps.Jps
# 67890 com.example.MyApplication
# 11111 org.apache.catalina.startup.Bootstrap

# 查看传递给 JVM 的参数
jps -v

# 输出:
# 67890 MyApplication -Xmx1024m -Xms256m -XX:+UseG1GC ...

jps 输出字段

jps 输出:
  PID   类名/主类名

jps -l 输出:
  PID   完整类名

jps -v 输出:
  PID   类名/主类名   JVM 参数

常用场景

bash
# 1. 快速找到 Java 进程 PID
jps | grep MyApplication

# 2. 找到所有 Java 进程
jps -lm

# 3. 查看远程服务器上的 Java 进程
jps rmi://hostname:port

jstat:统计信息监控

jstat 是 JVM 统计信息监控工具,用于观察 GC、类加载、编译等信息。

基本用法

bash
jstat -<option> <pid> [interval] [count]

GC 统计:-gcutil

最常用的选项,监控 GC 内存使用率:

bash
jstat -gcutil 67890 1000 10

# 输出:
#   S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
#   0.00  35.00  67.00  42.00  96.00  94.00     15    0.230     0    0.000    0.230

字段说明:

含义说明
S0Survivor 0 区使用率From 区
S1Survivor 1 区使用率To 区
EEden 区使用率伊甸园区
OOld 区使用率老年代
MMetaspace 使用率元空间(JDK 8+)
CCSCompressed Class Space压缩类空间
YGCYoung GC 次数Minor GC 总次数
YGCTYoung GC 总耗时
FGCFull GC 次数Full GC 总次数
FGCTFull GC 总耗时
GCTGC 总耗时

详细 GC 容量:-gc

bash
jstat -gc 67890

# 输出:
#   S0C      S1C      S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC    YGCT    FGC    FGCT     GCT
#  1024.0   1024.0     0.0   358.4  8192.0   5478.4   16384.0    6892.1   48640.0 46778.1  6144.0  5491.6     15    0.230     0    0.000    0.230

容量字段说明:

S0C = S0 Capacity(From 区容量,KB)
S1C = S1 Capacity(To 区容量,KB)
EC  = Eden Capacity(Eden 区容量,KB)
OC  = Old Capacity(老年代容量,KB)
MC  = Metaspace Capacity(元空间容量,KB)

类加载统计:-class

bash
jstat -class 67890

# 输出:
#   Loaded  Bytes  Unloaded  Bytes    Gc
#     3254  6789.2        0     0.0      0

# 含义:
# Loaded  → 已加载类数量
# Bytes   → 已加载类占用的字节数
# Unloaded → 已卸载类数量
# Gc      → 类回收触发次数

JIT 编译统计:-compiler

bash
jstat -compiler 67890

# 输出:
#  Compiled Failed Invalid   Time   FailedType FailedMethod
#      1250       0        0   45.23          0

实时监控示例

bash
# 每秒输出一次 GC 状态,共 20 次
jstat -gcutil 67890 1000 20

# 每 500ms 输出一次,共 100 次(高频监控)
jstat -gcutil 67890 500 100

# 监控 Full GC 次数
watch -n 1 'jstat -gcutil 67890 | grep FGC'

jinfo:查看和修改 JVM 参数

基本用法

bash
jinfo <pid>

查看当前 JVM 参数

bash
jinfo 67890

# 输出(部分):
# Java System Properties:
#     java.runtime.name = Java(TM) SE Runtime Environment
#     java.class.version = 61.0
#     user.home = /home/app
#
# VM Flags:
#     -Xmx1024m -Xms256m -XX:+UseG1GC ...

查看所有 JVM 选项

bash
# 查看所有可管理的 JVM 参数(PrintFlagsFinal 中的参数)
jinfo -flags 67890

# 查看指定参数
jinfo -flag MaxHeapSize 67890
# 输出:-XX:MaxHeapSize=1073741824

jinfo -flag PrintGCDetails 67890
# 输出:-XX:+PrintGCDetails

动态修改参数

bash
# 开启参数(布尔类型)
jinfo -flag +PrintGCDetails 67890

# 关闭参数
jinfo -flag -PrintGCDetails 67890

# 设置值
jinfo -flag MaxHeapSize=2g 67890

# 注意:只有 -XX:+Manageable 或 -XX:+Debuggable 的参数才能动态修改

实际应用场景

bash
# 场景:临时开启 GC 日志用于诊断
jinfo -flag +PrintGCDetails 67890
jinfo -flag +PrintGCDateStamps 67890

# 诊断完成后关闭
jinfo -flag -PrintGCDetails 67890

jmap:内存映射工具

jmap 用于生成堆转储(heapdump)和查看内存信息。

基本用法

bash
jmap [option] <pid>

查看堆使用情况

bash
jmap -heap 67890

# 输出:
# Heap Configuration:
#    MaxHeapSize              = 4294967296 (4096.0MB)
#    InitialHeapSize          = 268435456 (256.0MB)
#    NewSize                  = 134217728 (128.0MB)
#    MaxNewSize               = 143130624 (137.0MB)
#    OldSize                  = 268435456 (256.0MB)
#    SurvivorRatio            = 8
#    MetaspaceSize            = 21807104 (20.8MB)
#    CompressedClassSpaceSize = 1073741824 (1024.0MB)
#
# Heap Usage:
#    G1 Heap:
#      region size = 1024K
#      regions   = 4096
#      capacity  = 4294967296 (4096.0MB)
#      used     = 1849688064 (1764.0MB)
#      free     = 2445279232 (2332.0MB)
#      43.05% used

生成堆转储(heapdump)

bash
# 方式一:jmap(转储整个堆)
jmap -dump:format=b,file=heap.hprof 67890

# 方式二:jmap(live 子选项,只转储存活对象)
jmap -dump:live,format=b,file=live_heap.hprof 67890

# 方式三:JVM 参数自动转储(OOM 时)
java -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/path/to/dumps \
     -jar myapp.jar

关键区别:-dump 和 -dump:live

jmap -dump:format=b,file=heap.hprof <pid>
  → 转储整个堆(包括死对象),文件大,但保留完整内存状态

jmap -dump:live,format=b,file=heap.hprof <pid>
  → 先执行 Full GC,再转储存活对象
  → 文件小,分析效率高,但会触发 Full GC
  → 推荐使用

查看类直方图

bash
# 查看所有类的实例数量和内存占用
jmap -histo 67890 | head -30

# 输出:
#  num     #instances         #bytes  class name (module)
# -------------------------------------------------------
#    1:          12345        8901234  [Ljava.lang.Object;
#    2:           6789        1234567  [Ljava.lang.String;
#    3:           4567         987654  com.example.MyClass
#    ...

# 查看活跃对象的直方图(live)
jmap -histo:live 67890 | head -30

常用场景

bash
# 1. 诊断内存泄漏:生成堆转储
jmap -dump:live,format=b,file=heap_$(date +%Y%m%d_%H%M%S).hprof 67890

# 2. 快速查看内存占用
jmap -heap 67890 | grep used

# 3. 查看哪些类占用最多内存
jmap -histo 67890 | sort -k3 -rn | head -20

jhat:堆分析工具(已过时)

jhat 是 JDK 内置的堆转储分析工具,但功能有限,已被更专业的工具取代。

基本用法

bash
jhat heap.hprof
# 启动 HTTP 服务器,默认端口 7000
# 访问 http://localhost:7000 查看分析结果

局限性

jhat 的局限:
1. 功能简单,只能做基础查询
2. 不支持大堆转储(内存消耗大)
3. UI 简陋,分析效率低
4. 已被 MAT、JProfiler 等工具替代

推荐替代工具:
- MAT(Memory Analyzer Tool)→ 免费,功能强大
- JProfiler → 商业软件,界面友好
- VisualVM → 免费,JDK 自带

命令行工具组合拳

诊断问题时,常用以下组合:

bash
# 场景:CPU 突然飙升
# 第一步:找到进程
jps | grep MyApp
# 输出:67890 com.example.MyApp

# 第二步:查看 CPU 使用情况
top -p 67890

# 第三步:查看 GC 情况
jstat -gcutil 67890 1000 5

# 第四步:生成堆转储
jmap -dump:live,format=b,file=heap.hprof 67890

# 第五步:用 MAT 分析堆转储
# (打开 MAT,加载 heap.hprof)

本节小结

JDK 命令行工具速查:

命令核心功能常用选项
jps查看 Java 进程-l 完整类名,-v JVM 参数
jstatGC/类/JIT 统计-gcutil GC 使用率,-class 类加载
jinfo查看/修改 JVM 参数-flags 所有参数,-flag +/- 动态开关
jmap堆内存工具-heap 堆信息,-dump 转储,-histo 直方图
jhat堆转储分析已过时,用 MAT 替代

这五个工具是 JVM 诊断的基础,配合使用可以解决大部分性能问题。

下一节,我们来看 jstack/jcmd/jstatd 命令

基于 VitePress 构建