JVM 常用工具命令大全
定义:在JVM中主要有命令行工具和对应的图形化工具,命令行工具较为简单直接操作,图形化更容易通过一个可视平台去观看其中JVM信息的情况。二者都有其独特之处。
一、图形化工具
1. JConsole
启动命令:
jconsole
功能:
- 监控堆内存、线程、类加载情况
- 查看MBean信息
- 监控CPU使用率
- 支持远程连接JMX
2. VisualVM
启动命令:
jvisualvm
功能:
- 更强大的性能分析功能
- 支持插件扩展(如GC插件)
- 线程转储分析
- 内存采样和CPU分析
- 支持快照对比
二、命令行工具
1. jstat - JVM统计监控工具
常用命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
< >
:必须参数[ ]
:可选参数
常用选项:
选项 | 说明 |
---|---|
-class |
类加载统计 |
-gc |
GC堆状态 |
-gccapacity |
各区容量 |
-gcutil |
GC统计汇总 |
-gccause |
最近GC原因 |
-gcnew |
新生代统计 |
-gcold |
老年代统计 |
示例:
# 每1秒打印一次GC情况,共打印5次
jstat -gcutil -h5 <pid> 1000 5
# 带时间戳输出
jstat -gc -t <pid> 1000
2. jstack - 线程堆栈分析工具
命令格式:
jstack [-l] [-F] <pid>
常用参数:
参数 | 说明 |
---|---|
-l |
长列表,打印锁的附加信息 |
-F |
强制dump(当jstack无响应时使用) |
-m |
混合模式(Java和Native帧) |
示例:
# 获取线程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 - 内存分析工具
命令格式:
jmap [option] <pid>
常用选项:
选项 | 说明 |
---|---|
-heap |
显示堆概要信息 |
-histo[:live] |
显示堆中对象统计(live表示只统计存活对象) |
-dump:<format> |
生成堆转储快照 |
-finalizerinfo |
显示等待finalize的对象 |
示例:
# 生成堆dump文件(生产环境慎用,会STW)
jmap -dump:format=b,file=heap.hprof 1234
# 显示存活对象统计
jmap -histo:live 1234 | head -20
4. jinfo - 配置信息工具
命令格式:
jinfo [option] <pid>
常用功能:
# 查看所有系统属性
jinfo -sysprops <pid>
# 查看指定JVM参数
jinfo -flag MaxHeapSize <pid>
# 动态修改部分参数(仅支持可写的参数)
jinfo -flag +PrintGCDetails <pid>
三、使用技巧
组合使用示例
# 快速诊断流程
jps -mlvV | grep <app_name> # 找PID
jstat -gcutil <pid> 1000 5 # 看GC
jstack <pid> > thread.txt # 线程分析
jmap -histo:live <pid> | head -20 # 对象统计
生产环境注意事项
jmap -dump
会导致STW,谨慎使用- 优先使用
jcmd GC.heap_dump
替代jmap
- 线程dump建议连续做3次(间隔5秒)
- 使用
-F
参数时可能造成JVM暂停更久
常用分析流程
- 高CPU
top -H → jstack → 16进制线程ID匹配
- 内存泄漏
jmap -histo → 分析大对象 → jmap -dump → MAT分析
- GC问题
jstat -gcutil → 分析各分区变化