【JVM 常用工具命令大全】

一、图形化工具

1. JConsole

  • 启动命令

    bash 复制代码
    jconsole
  • 功能

    • 监控堆内存、线程、类加载情况
    • 查看 MBean 信息
    • 监控 CPU 使用率
    • 支持远程连接 JMX

2. VisualVM

  • 启动命令

    bash 复制代码
    jvisualvm
  • 功能

    • 更强大的性能分析功能
    • 支持插件扩展(如 GC 插件)
    • 线程转储分析
    • 内存采样和 CPU 分析
    • 支持快照对比

二、命令行工具

1. jstat ------ JVM 统计监控工具

  • 命令格式

    bash 复制代码
    jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    • < > 必须参数
    • [ ] 可选参数
  • 常用选项

    选项 说明
    -class 类加载统计
    -gc GC 堆状态
    -gccapacity 各区容量
    -gcutil GC 统计汇总
    -gccause 最近 GC 原因
    -gcnew 新生代统计
    -gcold 老年代统计
  • 示例

    bash 复制代码
    # 每 1 秒打印一次 GC 情况,共打印 5 次
    jstat -gcutil -h5 <pid> 1000 5
    
    # 带时间戳输出
    jstat -gc -t <pid> 1000

2. jstack ------ 线程堆栈分析

  • 命令格式

    bash 复制代码
    jstack [-l] [-F] <pid>
  • 常用参数

    参数 说明
    -l 长列表,打印锁的附加信息
    -F 强制 dump(当 jstack 无响应时使用)
    -m 混合模式(Java 和 Native 帧)
  • 示例

    bash 复制代码
    # 获取线程 dump 并输出到文件
    jstack -l 1234 > thread_dump.txt
    
    # 查找 CPU 高的线程(配合 top 命令)
    top -H -p <pid>
    printf "%x\n" <nid>     # 将线程 ID 转为 16 进制
    jstack <pid> | grep -A 20 <nid_hex>

3. jmap ------ 内存分析工具

  • 命令格式

    bash 复制代码
    jmap [option] <pid>
  • 常用选项

    选项 说明
    -heap 显示堆概要信息
    -histo[:live] 显示堆中对象统计(live 表示只统计存活对象)
    -dump 生成堆转储快照
    -finalizerinfo 显示等待 finalizer 的对象
  • 示例

    bash 复制代码
    # 生成堆 dump 文件(生产环境慎用,会 STW)
    jmap -dump:format=b,file=heap.hprof 1234
    
    # 显示存活对象统计
    jmap -histo:live 1234 | head -20

4. jinfo ------ 配置信息工具

  • 命令格式

    bash 复制代码
    jinfo [option] <pid>
  • 常用功能

    bash 复制代码
    # 查看所有系统属性
    jinfo -sysprops <pid>
    
    # 查看指定 JVM 参数
    jinfo -flag MaxHeapSize <pid>
    
    # 动态修改部分参数(仅支持可写的参数)
    jinfo -flag +PrintGCDetails <pid>

三、实用技巧

1. 组合使用示例

bash 复制代码
# 1. 找到目标应用的 PID
jps -mlvV | grep <app_name>

# 2. 观察 GC 情况
jstat -gcutil <pid> 1000 5

# 3. 分析线程
jstack <pid> > thread.txt

# 4. 查看对象分布
jmap -histo:live <pid> | head -20

2. 生产环境注意事项

  • jmap -dump 会导致 STW(Stop-The-World),谨慎使用
  • 优先使用 jcmd GC.heap_dump 替代 jmap
  • 线程 dump 建议连续做 3 次(间隔 5 秒)
  • 使用 -F 参数时,可能造成 JVM 暂停更久

3. 常用分析流程

  • 高 CPUtop -Hjstack → 16 进制线程 ID 匹配
  • 内存泄漏jmap -histo → 分析大对象 → jmap -dump → MAT 分析
  • GC 问题jstat -gcutil → 分析各分区变化
相关推荐
学到头秃的suhian2 小时前
JVM-类加载机制
java·jvm
NEFU AB-IN9 小时前
Prompt Gen Desktop 管理和迭代你的 Prompt!
java·jvm·prompt
唐古乌梁海14 小时前
【Java】JVM 内存区域划分
java·开发语言·jvm
众俗15 小时前
JVM整理
jvm
echoyu.15 小时前
java源代码、字节码、jvm、jit、aot的关系
java·开发语言·jvm·八股
代码栈上的思考1 天前
JVM中内存管理的策略
java·jvm
thginWalker1 天前
深入浅出 Java 虚拟机之进阶部分
jvm
沐浴露z1 天前
【JVM】详解 线程与协程
java·jvm
thginWalker1 天前
深入浅出 Java 虚拟机之实战部分
jvm
程序员卷卷狗3 天前
JVM 调优实战:从线上问题复盘到精细化内存治理
java·开发语言·jvm