
前段时间,发现线上某台服务器应用宕机了,分析了dump的内存占用信息,并未发现异常。再去翻看日志的时候,发现了大量的Metasapce的OOM,并且触发了多次Old GC,最后服务宕机。重启服务后,第二天又有一台服务器出现类似情况,当时服务还没有宕机,这里记录下当时用到的关于jstat的指令。
jstat是jdk自带的小工具,非常好用,这里记录 2 个非常有用的指令
jstat -gc pidjstat -gcutil pid先谈谈第一个gc,他会将jvm中各个分区的大小通过数值展示出来,比如下面这个
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 11264.0 0.0 11264.0 815104.0 711680.0 1270784.0 366371.4 260352.0 230441.1 32000.0 26848.4 577 12.002 0 0.000 12.002
这个数据不好看,我这里将其格式化一下:
| S0C | S1C | S0U | S1U | EC | EU | OC | OU | MC | MU | CCSC | CCSU | YGC | YGCT | FGC | FGCT | GCT |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 11264 | 0 | 11264 | 815104 | 711680 | 1270784 | 366371.4 | 260352 | 230441.1 | 32000 | 26848.4 | 577 | 12.002 | 0 | 0 | 12.002 |
上述转换利用到了如下 2 个小工具,非常推荐使用
excel的分隔处理,按照空格分隔接口- 数据转换 处理为
markdown
上面的数据可以通过如下几个维度解读
第一个维度:U和C结尾
C结尾的表示Capacity`,代表的是总共的容量U结尾的表示Used,代表使用容量第二维度:什么开头
S开头表示年轻代中的SurviorE开头表示的年轻代中的EdenO开头表示的老年代M开头表示的Metaspace,元数据YG开头表示的是年轻代的垃圾回收FG开头表示的全GC那么综上:
该指令更加强调百分比占比,可以直观的出占用率,比如
# 指令
jstat -gcutil 3418
# 结果
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 100.00 69.85 28.83 88.51 83.90 577 12.002 0 0.000 12.002
我们还是格式化下吧。
| S0 | S1 | E | O | M | CCS | YGC | YGCT | FGC | FGCT | GCT |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 100 | 69.85 | 28.83 | 88.51 | 83.9 | 577 | 12.002 | 0 | 0 | 12.002 |
上述数值的前几个都是百分比信息:
E为69.85,表示的就是Eden区已经占用了69.85%O为28.83,表示的是Old区已经占用了28.83%M为88.51,表示的就是Metaspace区已经占用了88.51%后面的几个参数
YGC表示的Young GC的次数YGCT表示的Young GC Time 就是YGC消耗的时间FGC和FGCT同理表示的Full GC的相关信息GCT表示的Global GC Time 整个垃圾回收暂用的时间。jstat是一个非常轻量级的小工具,希望这篇文章对你查看内存占用有帮助。