在Java开发与运维过程中,监控命令是排查性能瓶颈、分析系统状态的重要工具,通过合理运用Java自带的命令行工具以及操作系统级命令,可以实时获取JVM内存、线程、GC情况等关键信息,从而快速定位问题,以下将详细介绍常用的Java监控命令及其使用场景。

JPS命令:查看Java进程
JPS(Java Virtual Machine Process Status Tool)是JDK自带的基础工具,用于显示当前系统中所有Hotspot虚拟机的进程及其ID。
基本用法:
jps
:仅显示进程ID和主类名jps -l
:显示完整主类路径jps -v
:显示JVM启动参数jps -m
:显示传递给main方法的参数
示例输出:
1234 com.example.MainApplication
5678 org.apache.catalina.startup.Bootstrap
该命令适用于快速定位目标Java进程,为后续监控提供进程ID。
JSTAT命令:监控JVM运行时统计
JSTAT(JVM Statistics Monitoring Tool)是实时监控JVM运行状态的核心工具,可查看内存分配、GC频率、类加载情况等。
常用参数:

jstat -gc <pid>
:显示堆GC(新生代、老年代、元空间)的容量、已用空间、GC次数与耗时jstat -gcutil <pid>
:显示各内存区域使用百分比jstat -class <pid>
:统计类加载、卸载数量及元空间占用jstat -compiler <pid>
:查看JIT编译器编译方法次数与耗时
示例输出(gcutil):
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
512.0 512.0 0.0 512.0 3072.0 1024.0 4096.0 2048.0 512.0 256.0 64.0 32.0 2 0.123 1 0.456 0.579
S0C/S1C
为Survivor区容量,EU
为Eden区使用量,YGCT
为年轻代GC总耗时,通过该命令可判断内存泄漏或GC频繁问题。
JMAP命令:生成堆内存转储
JMAP(Memory Map)用于生成JVM的堆内存快照(Heap Dump),配合MAT等工具可分析内存泄漏原因。
常用参数:
jmap -heap <pid>
:打印堆内存配置(如新生代/老年代比例、GC算法)jmap -histo <pid>
:统计堆中对象数量与大小,按内存占用排序jmap -dump:format=b,file=<heapdump.hprof> <pid>
:生成二进制堆转储文件
示例输出(histo):

num #instances #bytes class name
-------------------------------------------
1 12345 12345678 [C
2 5678 8765432 java.lang.String
若某类对象数量异常激增,可能存在内存泄漏,堆转储文件可用于进一步分析对象引用链。
JSTACK命令:生成线程快照
JSTACK(Stack Trace)用于生成JVM当前线程的堆栈信息,适用于排查死锁、线程阻塞等问题。
基本用法:
jstack <pid>
:打印线程堆栈jstack -l <pid>
:显示锁信息(如死锁检测)
关键信息:
Runnable
:线程正在执行Waiting on condition
:等待资源(如I/O)Blocked on <object>
:等待锁,可能存在死锁
示例输出:
"main" #1 prio=5 os_prio=0 tid=0x00007f8c0400a000 nid=0x23 runnable [0x00007f8c04f2e000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:255)
若多个线程均显示Blocked on
同一对象,需检查锁竞争情况。
JCMD命令:多功能监控工具
JCMD是JDK 7+提供的全能命令,可替代部分旧工具(如jstat、jmap),支持在线诊断。
常用子命令:
jcmd <pid> GC.class_histogram
:同jmap -histojcmd <pid> Thread.print
:同jstackjcmd <pid> GC.heap_info
:打印堆内存概览jcmd <pid> VM.native_memory
:查看本地内存使用(如JNI、线程栈)
示例输出(GC.heap_info):
Heap:
PSYoungGen total 9216K, used 2048K
Eden Space 8192K, 25% used
From Space 1024K, 0% used
To Space 1024K, 0% used
操作系统级监控命令
- TOP/HTOP:查看进程CPU、内存占用,定位高负载Java进程。
- VMSTAT:监控进程上下文切换、空闲内存、CPU运行状态。
- IOSTAT:分析磁盘I/O瓶颈,若Java进程I/O等待高,需检查文件读写操作。
综合监控方案
实际场景中常结合多命令分析问题:
- 内存泄漏:先用
jps
定位进程,jmap -histo
观察对象异常,jmap -dump
生成堆转储深入分析。 - CPU飙高:
top
找到高CPU进程,jstack
查看线程堆栈,定位死循环或频繁计算代码。 - GC频繁:
jstat -gcutil
监控GC频率与耗时,若老年代GC频繁且耗时高,需调整JVM参数。
相关问答FAQs
Q1: 如何判断JVM是否存在内存泄漏?
A: 可通过以下步骤判断:
- 使用
jstat -gcutil <pid>
持续观察堆内存使用率,若每次Full GC后内存未回到正常水平,可能存在泄漏。 - 执行
jmap -histo <pid>
,若某类对象数量持续增长且不回收(如自定义缓存对象),需检查代码中是否存在未释放的引用。 - 生成堆转储文件(
jmap -dump
),通过MAT工具分析“大对象”或“GC Roots”引用链,定位泄漏源头。
Q2: 线程阻塞时如何快速定位问题?
A: 线程阻塞通常由锁竞争、I/O等待或死锁导致,可通过以下步骤排查:
- 执行
jstack -l <pid>
生成线程快照,搜索BLOCKED
或Waiting on condition
状态的线程。 - 检查线程堆栈中的锁信息,若多个线程等待同一锁对象(如
synchronizing on a lock
),需优化锁粒度或检查死锁。 - 结合
top
查看CPU使用率,若CPU空闲但线程阻塞,优先排查I/O操作(如网络超时、文件读写阻塞)。