Skip to content

一、常用的命令

我这里准备了一个 SpringBoot 项目,接下来,我将从实际案例,来看一下,下面的这些命令。

基础环境:JDK 1.8.301

jps

命令的格式

markdown
jps [option] [hostId]

主要的选项如下

选项作用
-q
-m输出虚拟机进程启动时传递给主类的参数
-l输出主类的全名,如果进程执行的是 jar 包,输出 Jar 路径
-v输出虚拟机集成启动的时候的 JVM 参数

对于这个命令,可以查看一下当前虚拟机运行了那些 Java 进程。

如果不加任何的参数如下,只能看到进程号

markdown
[coding@hcss-ecs-5718 dubbo-provider]$ jps
852894 Jps
852761 jar

如果需要查看时那个 jar 的时,就需要添加 -l 参数

markdown
[coding@hcss-ecs-5718 dubbo-provider]$ jps -l
852761 dubbo-provider-1.0.0-SNAPSHOT.jar
852953 sun.tools.jps.Jps

如果想查看启动的时候携带的 JVM 参数信息可以添加 -v

markdown
[coding@hcss-ecs-5718 dubbo-provider]$ jps -lv
853071 sun.tools.jps.Jps -Dapplication.home=/home/coding/jdk8 -Xms8m
853025 dubbo-provider-1.0.0-SNAPSHOT.jar -Xmx1024m

jstat

作用:监视虚拟机的各种运行状态

命令的格式

markdown
jstat [option] vmid [interval][s|ms] [count]

其中,interval 表示查询间隔,count 表示查询的次数,如果省略这两个参数,表示只查询一次。我们可以借助于这两个参数分析一下,各分区对象的增长速度。

主要的选项如下:

-gc : 监控 Java 堆的状况

image-20241216222608433

其中各个参数对应的含义如下:

参数含义参数含义
S0Cs0 区的容量MU方法区使用的大小
S1Cs1 区的容量CCSC压缩类空间的大小
S0Us0 区已经使用的大小CCSU压缩类空间的使用大小
S1Us1 区已经使用的大小YGC进行 Young GC 的次数
ECEden 区的容量YGCT进行 YoungGC 总耗时
EUEden 区已经使用的大小FGC进行 Full GC 的次数
OC老年代的容量FGCT进行Full GC 总耗时
OU老年代已经使用的大小GCT所有 GC 的总耗时
MC方法区的大小

-gcutil : 监控内容与 -gc 一致,但是输出主要关系的是 占用的 百分比

image-20241216222816905

对于统计的指标量,不再是使用当前大小,而是占用的百分比,如 Eden 区占用了 39.44% 的内存

jmap

作用:生成堆转储快照

命令格式:

markdown
jmap [option] pid

常见的选项如下

选项作用
-dump生成 Java 快照,格式为:-dump:[live,]format=b,file=<filename>
-heap显示 Java 堆的详细信息
-histo显示堆中对象统计信息
-F如果 -dump 没有响应的时候,可以通过这个选项,强制生成 dump 快照
-finalizerinfo显示在 F-Queue 中等待 Filalizer 线程执行 finalize 方法的对象

比如说,我们可以通过如下的方式,生成快照,借助于 Eclipse mat 工具来进行二次分析

markdown
[coding@hcss-ecs-5718 dubbo-provider]$ jmap -dump:format=b,file=dubbo-provider.bin 853025
Dumping heap to /home/coding/dubbo-provider/dubbo-provider.bin ...
Heap dump file created
[coding@hcss-ecs-5718 dubbo-provider]$

jstack

作用:用于生成虚拟机当前时刻的线程快照

命令格式如下:

markdown
jstack [option] pid

常用的选项如下:

选项作用
-F当正常输出的请求无法响应的时候,强制输出
-l除了显示堆栈之外,显示锁的附加信息
-m如果调用本地方法,可以显示 C++/C 的堆栈

image-20241216230537565

输出结果之中,比较重要的是 nid ,显示为 16进制。比如,我们执行了如下的命令:

image-20241216231432834

我们将 PID 列对应的内容,转为 16 进制,去 jstack 的输出结果之中,找对应的 nid ,我们就能够找到占用 CPU 较高的线程是那个了,这也是分析 CPU 冲高的分析方式之一。

二、Eclipse mat