【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 → 分析各分区变化
相关推荐
my_realmy1 天前
Java 基础面试笔记(二):JDK、JRE、JVM、JIT 与 JAR
jvm·虚拟机·jit·特性·jre·垃圾回收机制
Nuanyt1 天前
JUC常见核心知识梳理01 线程 并发 JMM volatile 管程 锁 synchronized
java·开发语言·网络·jvm
CodeStats1 天前
【Java 类加载器】Java 类加载器完整体系深度拆解(中):URLClassLoader 能力剖析与继承委派辨析
java·jvm·classloader·类加载器
驭渊的小故事1 天前
多线程02
java·开发语言·jvm
CodeStats2 天前
【Java 类加载器】Java 类加载器完整体系深度拆解(上):从 JVM 启动到双亲委派模型
java·开发语言·jvm·classloader·双亲委派
CodeStats2 天前
【Java类加载器】Java 类加载器完整体系深度拆解(下):自定义加载器实战与 SPI 破坏双亲委派(MySQL 驱动揭秘)
java·开发语言·jvm·classloader·双亲委派
Nuanyt2 天前
JVM常见核心知识梳理02 类加载 字节码技术 双亲委派 Java内存模型 JMM 并发底层 volatile synchronized 常见排障与调优工具
java·开发语言·jvm
焦虑的说说2 天前
jvm知识汇总
jvm
头茬韭菜2 天前
第 1 篇:「架构鸟瞰与 Memory 初始化」—— 从 pip install 到三个工厂
jvm·架构·pip·mem0
程序员清风2 天前
从 JVM 内存模型到 GC 调优:Java 服务性能优化实战
java·jvm·性能优化