高效编码简单全面JDK的监控命令,看这一篇就够了!!日拱一卒

Posted 码农飞哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高效编码简单全面JDK的监控命令,看这一篇就够了!!日拱一卒相关的知识,希望对你有一定的参考价值。

您好,我是码农飞哥,感谢您阅读本文!如果此文对您有所帮助,请毫不犹豫的一键三连吧。小伙伴们有啥想看的,想问的,欢迎积极留言告诉我喔。 上一篇文章我们介绍了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堆的状况,包括老年代,新生代的堆内存的使用情况。查询结果如下图所示:
在这里插入图片描述

[root@i ~]# jstat -gc 9622 250 10
 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命令。希望对读者朋友们有所帮助

参考

jstat命令详解
jstat命令使用
JVM07-虚拟机故障处理之命令行工具

以上是关于高效编码简单全面JDK的监控命令,看这一篇就够了!!日拱一卒的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript看这一篇就够了,简单全面一发入魂

Java基础算法看这一篇就够了,简单全面一发入魂

JavaScript面试题看这一篇就够了,简单全面一发入魂(持续更新 step2)

Git 看这一篇就够了

Git 看这一篇就够了

JDK 11关于 Java 模块系统,看这一篇就够了