【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 → 分析各分区变化
相关推荐
java_upp3 小时前
JVM内存溢出和内存泄漏的区别及排查方法
jvm·内存泄漏·内存溢出
城管不管14 小时前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试
mister_guo1 天前
JVM 内存管理原理及生产配置实战:从“参数能启动”到“内存可控”
java·jvm
wear工程师3 天前
Java 类初始化到底何时触发?别把加载、连接和 static 执行混在一起
java·jvm
程序员雷欧3 天前
线上频繁触发各种 GC 的原因排查与处理指南
java·jvm·算法
wuminyu3 天前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
147API4 天前
Python批量生成蒸馏数据,并发、重试、幂等和断点续跑
开发语言·jvm·python
wuminyu4 天前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++
sunywz5 天前
【JVM】(8)JVM调优实战及常量池详解
jvm
wuminyu5 天前
虚拟线程底层ForkJoinPool的工作窃取算法机制
java·linux·c语言·jvm·c++