文章目录
1. 使用背景
一般来说,中大型公司都会有自己的应用监控系统,比如开源的 Zabbix、Open-Falcon、Prometheus等,也可能一些公司自己实现了监控或者告警系统;这些系统可以监控所有在线上的各种应用的运行情况,一旦发生异常(比如CPU利用率过高、FullGC频繁等)会直接通过短信、邮箱或者IM工具发送告警给管理员。
但是对于开发人员来说,并不应该依赖这些监控系统;熟练的使用各种命令行工具,在命令行中就能实现问题的发现定位及解决,是一个优秀工程师的必备技能。
所以我们需要掌握一些简单易用,且高效实用的命令行jvm监控工具,来让我们日常的开发和解决问题更加高效。
2. jstat 的介绍及使用
jstat 就是JDK中自动的一个非常有用的命令,它可以展示出当前运行系统的JVM的Eden、Survivor、老年代等的内存使用情况,还能展示出Young CG、Full GC等的执行情况及耗时。
通过这些指标,我们就可以轻松的分析出当前系统的运行情况、GC情况、内存分配是否合理等。
2.1 jstat -gc PID 介绍
在服务器上执行jps(不懂的自行百度)命令,就可以看到当前服务器中正在运行的java进程,每个进程前面会有一个进程ID,也就是这里的PID。
然后使用这个PID来执行 jstat -gc PID
命令:
jstat -gc PID
: 只能得到当前系统运行情况的一行指标;
jstat -gc PID 1000 10
:每1000毫秒(1秒)执行一次,共执行10次;
jstat -gc PID 1000
:每秒执行一次,一直不停的执行;
示例:
- S0C:From Survivor区的大小;
- S1C:To Survivor区的大小;
- S0U:From Survivor区当前使用的内存大小;
- S1U:To Survivor区当前使用的内存大小;
- EC:Eden区的大小;
- EU:Eden区当前使用的内存大小;
- OC:老年代的大小;
- OU:老年代当前使用的内存大小;
- MC:方法区(永久代、元数据区)的大小;
- MU:方法区(永久代、元数据区)的当前使用的内存大小;
- YGC:系统运行迄今为止的Young GC次数;
- YGCT:Young GC的耗时;
- FGC:系统运行迄今为止的Full GC次数;
- FGCT:Full GC的耗时;
- CGC:Concurrent GC的次数;(JDK11)
- CGCT:Concurrent GC的耗时;(JDK11)
- GCT:所有GC的总耗时;
到这里,如果JVM基础好一点的同学,你应该能够发现:根据这些指标,我们就能完成JVM的各项监控了;
这个命令也是 最完整、最常用和最实用的jstat的命令。
2.2 其他的 jstat命令
- jstat -gccapacity PID:堆内存分析;
- jstat -gcnew PID:年轻代GC分析;(TT和MTT:对象在年轻代存活的年龄和存活的最大年龄)
- jstat -gcnewcapacity PID:年轻代内存分析;
- jstat -gcold PID:老年代GC分析;
- jstat -gcoldcapacity PID:老年代内存分析;
- jstat -gcmetacapacity PID:元数据区内存分析;
这些命