JVM诊断的常用命令以及参数
在上文 JVM启动的常用命令以及参数 中我们了解了如何启动 JVM ,以及在启动时如何添加参数,不同于 Java 命令,JVM 诊断命令是用来诊断运行中的 JVM 的。
常用诊断命令
1. top
top 不是 JVM 提供的命令,它是 Linux 系统中一个功能强大的性能监控工具💻,它可以实时、动态地显示系统整体性能指标以及各个进程的资源占用情况,类似于 Windows 系统中的任务管理器。它通常是故障排查和性能分析的首选工具。
使用方法:
top

解释说明:
| 区域 | 信息 | 含义说明 |
|---|---|---|
| 第1行 | 系统运行时间与负载 | 当前时间、系统已运行时间、当前登录用户数、系统平均负载(1分钟、5分钟、15分钟) |
| 第2行 | 任务(进程)信息 | 进程总数、运行中进程数、休眠进程数、停止进程数、僵尸进程数 |
| 第3行 | CPU 使用情况 | 用户空间占用百分比(us)、内核空间占用百分比(sy)、空闲百分比(id)、等待I/O的百分比(wa)等 |
| 第4行 | 物理内存使用(单位为M) | 总内存、已使用内存、空闲内存、缓冲缓存内存量 |
| 第5行 | 交换分区(Swap)使用 | 交换分区总量、已使用量、空闲量 |
| 进程信息区 | PID | 进程ID |
| USER | 进程所有者 | |
| %CPU | 进程占用CPU百分比 | |
| %MEM | 进程占用物理内存百分比 | |
| COMMAND | 启动进程的命令名或命令行 |
常用命令行选项:
可以在使用 top 命令时直接加入这些选项
| 选项 | 含义 | 示例 |
|---|---|---|
| -d <秒数> | 设置屏幕刷新间隔时间,单位秒 | top -d 1 (每秒刷新一次) |
| -p <&PID> | 仅监视指定的进程ID | top -p 1234 (只查看PID为1234的进程) |
| -u <用户名> | 仅显示指定用户的进程 | top -u www-data (只查看属于www-data用户的进程) |
| -b | 以批处理模式运行,常用于将输出重定向到文件 | top -b -n 3 > top_log.txt (运行3次后输出到文件) |
| -n <次数> | 与 -b 配合,指定 top 命令运行的次数后退出 | 同上 |
| -c | 显示进程的完整命令行 | top -c (方便查看进程的完整启动参数) |
| -H | 显示线程信息(需要结合 -p 使用) | top -H -p 1234 (查看PID为1234的进程下的所有线程) |
比如:
top -c :显示进程的完整命令行
top -c

top -H -p :查看PID进程下的所有线程资源占用
top -H -p 2377735
下面的 pid 就表示线程id了

交互式命令(在 top 运行中按键生效):
在 top 运行界面,按下这些键可以改变显示方式或操作进程:
| 按键 | 功能 |
|---|---|
| h | 显示帮助画面,查看所有可用的交互命令 |
| k | 终止一个进程,输入PID和信号(默认15) |
| i | 忽略闲置(Idle)或僵尸(Zombie)进程,是一个开关 |
| M | 根据内存使用率(%MEM)排序 |
| P | 根据CPU使用率(%CPU)排序(默认顺序) |
| T | 根据进程运行时间(TIME+)排序 |
| N | 以PID从大到小排序 |
| R | 反转排序顺序 |
| 1 | 切换显示所有CPU核心的单独状态(再按一下切回总体) |
| f | 进入字段管理界面,可以选择显示或隐藏哪些列 |
| W | 将当前 top 设置写入配置文件(~/.toprc) |
| q | 退出 top |
比如:
在使用 top -c 命令后,在top运行界面按 M 可以按内存使用率排序

2. jps
jps(Java Virtual Machine Process Status Tool) 的主要功能是:列出当前用户下所有正在运行的 Java 进程的 PID(进程 ID)和主类名。它的输出类似于 Linux 中的 ps -ef | grep java,但比后者更准确和方便,因为它直接查询目标机器上的 Java 进程信息,而无需依赖字符串匹配。
使用语法
jps [options] [hostid]
- 大多数情况下,我们只在本地使用,不需要 hostid。
- options 是控制输出内容的选项。
最常用的选项:
| 选项 | 作用 | 示例 |
|---|---|---|
| -q | 只输出进程的 PID(安静模式) | jps -q → 12345 |
| -l(小写的L) | 输出应用程序主类的完整包名(非常常用) | jps -l → 12345 com.example. |
| -m | 输出传递给 main() 方法的参数 | jps -m → 12345 arg1 arg2 |
| -v | 输出传递给 JVM 的参数(如 -Xmx, -D 等) | jps -v → 12345 -Xms512m -Xmx1g |
| -V | 输出通过 .jar 文件中的 JAR MANIFEST 设置的参数 |
使用示例:
jps -l -m -v

3. jinfo
使用 jinfo 命令(Java Configuration Info)来查看指定 PID 的详细配置信息。
使用示例:
查看 PID 为 2377735 的 java 进程的详细配置信息,包括 jvm 的配置参数值
jinfo 2377735


如上:这个java进程的 jvm MaxHeapSize 为 490733568 (大概 468M),我这台机器总的物理内存为 1.8 G,堆内存允许的最大值大概是物理内存的 1/4。
物理内存查看方式如下:

查询特定参数值:
jinfo -flag <FlagName> <PID>
比如只查看 MaxHeapSize 的值:
jinfo -flag MaxHeapSize 2377735

4. jstat
jstat(Java Virtual Machine Statistics Monitoring Tool) 用于持续监控并输出目标 JVM 进程的性能统计信息,特别是与堆内存和垃圾回收相关的详细数据。
它的核心价值在于:无需开启冗长的 GC 日志,就能以极小的性能开销,实时观察 JVM 内存池的使用量和 GC 活动的频率及耗时。
基本语法:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
- -<&option>:指定要查看的统计信息类型(见下表)。
- <&vmid>:目标 Java 进程的 PID(用 jps -l 获取)。
- <&interval>:连续输出之间的间隔时间(单位:秒或毫秒,如 1s, 500ms)。
- <&count>:打印多少次统计信息后退出。
- -t:在输出中增加一列时间戳(从 JVM 启动开始计算的秒数)。
- -h<&n>:每输出 n 行后,打印一次列标题。
最常用的选项:
| 选项 | 作用 | 说明 |
|---|---|---|
| -gcutil | (最常用) 以百分比形式显示各代空间的利用率摘要。 | 快速健康检查首选。 |
| -gc | 显示各代空间的容量(Capacity)和使用量(Used)。 | 查看绝对数值(KB)。 |
| -gccapacity | 显示各代空间的最小、最大容量及当前容量。 | 查看内存池大小如何变化。 |
| -gcmetacapacity | JDK 8+ 显示元空间(Metaspace)的容量信息。 | 替代 JDK 7 的 -gcpermcapacity。 |
| -gcnew | 显示新生代(Young Gen)的GC统计信息。 | 关注 Minor GC。 |
| -gcold | 显示老年代(Old Gen)的GC统计信息。 | 关注 Major/Full GC。 |
使用示例:
每秒刷新一次,共刷新 5 次,并显示时间戳,以此方式显示 PID 为 2377735 的 java 进程的堆内存和垃圾回收相关的详细数据。
jstat -gcutil -t 2377735 1s 5

可以看到当 E 区内存到达 99.14 时发生了以此 YGC,YGC 次数由 118 变成119。
[root@** ~]# jstat -gcutil -t 2377735 1s 500
Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
780068.4 26.05 0.00 18.76 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780069.4 26.05 0.00 18.76 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780070.4 26.05 0.00 18.76 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780071.4 26.05 0.00 18.76 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780072.4 26.05 0.00 21.36 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780073.4 26.05 0.00 30.17 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780074.4 26.05 0.00 37.49 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780075.4 26.05 0.00 48.85 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780076.4 26.05 0.00 58.16 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780077.4 26.05 0.00 70.88 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780078.4 26.05 0.00 87.91 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780079.4 26.05 0.00 99.14 44.37 94.82 92.00 118 0.784 3 0.379 1.163
780080.4 0.00 40.64 12.54 44.39 94.82 92.00 119 0.788 3 0.379 1.166
780081.4 0.00 40.64 19.82 44.39 94.82 92.00 119 0.788 3 0.379 1.166
780082.4 0.00 40.64 20.41 44.39 94.82 92.00 119 0.788 3 0.379 1.166
780083.4 0.00 40.64 20.41 44.39 94.82 92.00 119 0.788 3 0.379 1.166
780084.4 0.00 40.64 20.49 44.39 94.82 92.00 119 0.788 3 0.379 1.166
780085.4 0.00 40.64 20.50 44.39 94.82 92.00 119 0.788 3 0.379 1.166
各列含义:
- Timestamp: JVM 启动后经过的时间(秒)。由 -t 选项生成。
- S0: Survivor 0 区当前使用百分比。
- S1: Survivor 1 区当前使用百分比。
- E: Eden 区当前使用百分比。快速增长表示在创建新对象。
- O: 老年代(Old)当前使用百分比。持续缓慢增长可能预示内存泄漏。
- M / CCS: (JDK 8+) 元空间(Metaspace)和压缩类空间(Compressed Class Space)使用率。
- YGC: Young GC(Minor GC)发生次数。
- YGCT: Young GC 累计耗时(秒)。
- FGC: Full GC 发生次数。这个数字需要特别关注,频繁 Full GC 会导致应用停顿。
- FGCT: Full GC 累计耗时(秒)。
- GCT: 所有 GC 的总耗时(YGCT + FGCT)。
5. jstack
jstack(Java Stack Trace Tool) 的主要功能是:连接到指定的 Java 进程,并输出其内部所有线程的完整调用堆栈信息。
6. jmap
jmap(Java Memory Map)是 Java 开发者和运维人员工具箱中又一个至关重要的命令行工具。它主要用于生成堆转储快照(Heap Dump)和查询 Java 进程的堆内存相关信息。
基本语法:
jmap [option] <pid>
常用选项:
| 选项 | 作用 | 说明与示例 |
|---|---|---|
| -dump:[live,]format=b,file=<&filename> | (最核心)生成堆转储文件 | -dump:live,format=b,file=heap.hprof live 子选项表示只转储存活的对象(会触发一次Full GC)。 |
| -heap | 显示堆的摘要信息 | 显示GC算法、堆配置、各内存区域(Eden, Old, Metaspace等)的容量和使用情况。jmap -heap <&pid> |
| -histo[:live] | 显示堆中对象的直方图 | 按类名统计实例数量和占用空间,live 选项只统计存活对象(该命令会触发Full GC)。jmap -histo:live <&pid> | head -20 |
| -finalizerinfo | 显示正等待回收的对象 | 查看等待 finalize 方法执行的对象数量。 |
| -clstats | 显示类加载器统计信息 | 打印类加载器的内存统计(JDK 8+ 的 -clstats 替代了旧的 -permstat) |
举例:
jmap -heap 2377735
[root@**** ~]# jmap -heap 2377735
Attaching to process ID 2377735, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration: // 堆配置
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 490733568 (468.0MB) // -Xmx
NewSize = 10485760 (10.0MB) // 新生代初始大小
MaxNewSize = 163577856 (156.0MB) // 新生代最大大小
OldSize = 20971520 (20.0MB) // 老年代大小
NewRatio = 2 // 新生代:老年代
SurvivorRatio = 8 //用于设置 Eden区 与 一个Survivor区 的大小比例,
// 新生代由 1 个 Eden 区和 2 个 Survivor 区组成,因此总份数为 8 + 1 + 1 = 10,
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: // 堆使用情况
PS Young Generation // 新生代使用情况
Eden Space:
capacity = 23068672 (22.0MB)
used = 9486560 (9.047088623046875MB)
free = 13582112 (12.952911376953125MB)
41.12313010475852% used
From Space:
capacity = 1572864 (1.5MB)
used = 704688 (0.6720428466796875MB)
free = 868176 (0.8279571533203125MB)
44.8028564453125% used
To Space:
capacity = 1572864 (1.5MB)
used = 0 (0.0MB)
free = 1572864 (1.5MB)
0.0% used
PS Old Generation
capacity = 60293120 (57.5MB)
used = 26769576 (25.529457092285156MB)
free = 33523544 (31.970542907714844MB)
44.399055812669836% used
30532 interned Strings occupying 2892240 bytes.
JVM诊断的常用命令以及参数&spm=1001.2101.3001.5002&articleId=150603902&d=1&t=3&u=fa34411584fb47cd9a0c3d60d09b94bd)
2044

被折叠的 条评论
为什么被折叠?



