您好,我是码农飞哥,感谢您阅读本文!如果此文对您有所帮助,请毫不犹豫的一键三连吧。小伙伴们有啥想看的,想问的,欢迎积极留言告诉我喔。 上一篇文章我们介绍了JDK中一些基础的常用的命令,BUT,这还远远不够!!SO,这篇文章我们将继续来介绍JDK中监控相关的命令。话不多说,让我们直接进入主题。
总览
首先,我们看下这篇文章所要介绍的相关的监控命令。一共有4个命令。本文会重点介绍jstat命令。
jps
首先介绍的命令是jps命令,这个命令的作用在目标系统上列出所有的HotSpot Java 虚拟机进程的描述信息。其用法是:
jps [-q] [-mlvV] [<hostid>]
。jps还可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,参数hostid为RMI注册表中的注册的主机名,jps的其他常用选项见下表。
选项 | 作用 |
-q | 只输出LVMID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-l | 输出主类的全名,如果进程执行的是JAR包,则输出JAR路径 |
-v | 输出虚拟机进程启动时的JVM参数 |
举个栗子
jps -l
命令走一波看看。如下图所示,该命令列出了当前服务器上所有正在运行的虚拟机进程的进程号和应用主类的全名。这个命令的作用是为后面jstat命令获取进程号。
jstat
说完了jps命令之后,接下来让我们来看看本文的重点命令。jstat命令,这个命令的作用是用于监控虚拟机各种运行状况信息的命令行工具,它可以显示本地 或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。它的用法是:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
各个选项以及其作用如下表所示,我们需要重点关注<option>
。
选项 | 作用 |
<option> |
指定需要的操作,比如统计监控类加载、卸载数量、总空间以及类装载所耗费的时间 则传入 -class ,后面会详细介绍 |
<vmid> |
虚拟机标识符,vmid的形式如下:< lvmid >[@ <主机名>[:<端口>]] |
<lines> |
标题行之间的样本数 |
<interval> |
查询间隔,默认的单位是 ms(毫秒)或者s(秒) |
<count> |
查询次数 |
option的介绍
option是jstat命令中非常重要的一个参数,这个参数决定了该命令需要统计的信息。我们首先通过jstat -options
命令来看看该参数可以传入哪些值。
可以看出,该参数一共可以传入12个选项,那么每个值都是些啥意思呢?下表就列举了这12个选项的作用吧!
选项 | 作用 |
-class | 监控类加载、卸载数量、总空间以及类装载所耗费的时间 |
-compiler | 输出即时编译过的方法,耗时等信息 |
-gc | 监控Java堆状况,包括Eden区、2个Survivor区、老年代(或元空间)、永久代等的容量,已用空间、垃圾收集时间合计等信息 |
-gccapacity | 监控内容与-gc基本相同,但输出主要关注已使用Java堆各个区域使用的最大、最小空间 |
-gcutil | 监控内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 |
-gccause | 与-gcutil功能一样,但是会额外输出导致上次垃圾收集产生的原因 |
-gcnewcapacity | 监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代垃圾收集状况 |
-gcoldcapacity | 监控内容与-gcold基本相同,输出主要关注使用到的最大、最小空间 |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
-printcompilation | 输出已经被即时编译的方法 |
实操一下吧
类加载信息统计(-class)
以9622 这个应用为例, 怎么查看其类加载信息的统计信息呢?
[root@i- ~]# jstat -class 9622 Loaded Bytes Unloaded Bytes Time 20124 37973.5 2 1.8 95.91
这里统计了类加载,卸载的数量以及加载类所用的时间。
显示列名 | 具体描述 |
Loaded | 加载的class的数量 |
Bytes | 所占空间的大小 |
Unloaded | 卸载类的数量 |
Bytes | 卸载类(未加载类)的字节数 |
Time | 装载和卸载类所花费的时间 |
垃圾回收统计(-gc)
比如现在线上应用发生了内存溢出的问题,你的老大让你排查一下,你该如何编写命令呢?是不是有点头大,没关系的,这就帮你排忧解难。以前面的9622进程为例。
jstat -gc 9622 250 10
该命令表示在250毫秒内,查询10次,9622进程的JVM堆的状况,包括老年代,新生代的堆内存的使用情况。查询结果如下图所示:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 1024.0 1024.0 625.6 0.0 67584.0 63365.4 500736.0 135770.1 128204.0 120745.9 14796.0 13479.9 642 15.107 4 0.548 15.655
卧槽,这么多列,每一列啥意思呀,不懂呀!!!不要急,不要慌,听我慢慢道来。
显示列名 | 具体描述 |
S0C | 年轻代中第一个survivor(幸存区)的容量(字节) |
S1C | 年轻代中第二个survivor(幸存区)的容量(字节) |
S0U | 年轻代中第一个survivor(幸存区)目前已使用空间(字节) |
S1U | 年轻代中第二个survivor(幸存区)目前已使用空间(字节) |
EC | 年轻代中Eden(伊甸园) 的容量(字节) |
EU | 年轻代中Eden(伊甸园) 目前已使用空间(字节) |
OC | 老年代的容量(字节) |
OU | 老年代目前已经使用空间(字节) |
MC | 元空间的容量(字节)(ps:JDK8中)移除了永久代,取而代之的是元空间 |
CCSC | 压缩类空间大小(字节) |
CCSU | 压缩类空间使用大小(字节) |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
YGCT | 从应用程序启动到采样时年轻代gc所用时间(s) |
FGC | 从应用程序启动到采样时老年代(全gc)中gc次数 |
FGCT | 从应用程序启动到采样时老年代gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
编译统计( -compiler )
以9622 这个应用为例, 怎么查看其编译统计信息呢?
[root@i- ~]# jstat -compiler 9622 Compiled Failed Invalid Time FailedType FailedMethod 26527 6 0 153.79 1 java/lang/String format
每一项的介绍如下:
显示列名 | 具体描述 |
Compiled | 编译任务执行数量 |
Failed | 编译任务执行失败数量 |
Invalid | 编译任务不可用的数量 |
Time | 编译任务总的花费时间 |
FailedType | 最后一个编译失败任务的类型 |
FailedMethod | 最后一个编译失败任务所在类以及方法 |
垃圾回收统计,使用空间占总空间的百分比(-gcutil)
-gcutil 监控内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
[root@i- ~]# jstat -gcutil 9622 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 73.70 63.77 27.33 94.19 91.11 659 15.490 4 0.548 16.038
每一项的介绍如下:
显示列名 | 具体描述 |
S0 | 年轻代中第一个survivor(幸存区)已使用空间占当前容量百分比 |
S1 | 年轻代中第二个survivor(幸存区)已使用空间占当前容量百分比 |
E | 年轻代Eden(伊甸园)已使用空间占当前容量百分比 |
O | 老年代已使用空间占当前容量百分比 |
M | 元空间已使用空间占当前容量百分比 |
CCS | 压缩类空间大小已使用空间占当前容量百分比 |
YGC | 从应用程序启动到采样时年轻代中gc次数 |
YGCT | 从应用程序启动到采样时年轻代gc所用时间(s) |
FGC | 从应用程序启动到采样时老年代(全gc)中gc次数 |
FGCT | 从应用程序启动到采样时老年代gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
jconsole
jconsole 这个命令用于监控Java虚拟机的使用JMX规范的图形工具。它可以监控本地和远程JVM。它 还可以监控和管理应用程序。详细可以参考JVM08-虚拟机故障处理之可视化故障处理工具JConsole工具
总结
本文详细介绍了监控JDK的常用命令,最最最重要的命令是jstat命令。希望对读者朋友们有所帮助