JVM-(9)JVM诊断的常用命令以及参数

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>仅监视指定的进程IDtop -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显示各代空间的最小、最大容量及当前容量。查看内存池大小如何变化。
-gcmetacapacityJDK 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值