【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. 常用分析流程

  • 高 CPU :top -H → jstack → 16 进制线程 ID 匹配
  • 内存泄漏 :jmap -histo → 分析大对象 → jmap -dump → MAT 分析
  • GC 问题 :jstat -gcutil → 分析各分区变化
相关推荐
wuminyu1 小时前
JVM规范学习总结-Java源码经过javac编译后产物
java·linux·c语言·jvm·c++
学到老活到老19 小时前
类已经加载了,为什么静态代码还没执行?
java·jvm
学到老活到老19 小时前
写了 new,就一定会在堆上分配对象吗?
java·jvm
笨笨饿1 天前
# 59_CSDN博客自动写流程文章
linux·jvm·stm32·单片机·嵌入式硬件·mcu·51单片机
tedcloud1231 天前
Docker Compose 部署 Memos:从安装到备份恢复
linux·开发语言·jvm·后端·docker·容器·rust
螺蛳粉 螺蛳粉1 天前
大数据第四篇:事故复盘:移走 HBase 里 27 个 hadoop-2.10.2 jar 后,HMaster 半小时后“自杀“了【jar 事故复盘】
jvm·hadoop·hbase·异常处理·大数据运维·踩坑记录·事故复盘
wuminyu1 天前
JVM规范学习总结-JVM规范基本概念
java·linux·c语言·jvm·c++
学到老活到老2 天前
方法执行完了,对象为什么还占着内存?
java·jvm
骑着蜗牛撵大象3272 天前
四种库收进一个SQL编辑器(下):跨库取数、方言对齐与四库巡检的落地拆解
jvm·数据库·sql·编辑器·数据迁移·跨库查询
需要8263 天前
容器化 Java:镜像瘦身与 JVM 容器感知(cgroup)
java·开发语言·jvm