前段时间,发现线上某台服务器应用宕机了,分析了dump
的内存占用信息,并未发现异常。再去翻看日志的时候,发现了大量的Metasapce
的OOM
,并且触发了多次Old GC
,最后服务宕机。重启服务后,第二天又有一台服务器出现类似情况,当时服务还没有宕机,这里记录下当时用到的关于jstat
的指令。
jstat
是jdk
自带的小工具,非常好用,这里记录 2 个非常有用的指令
jstat -gc pid
jstat -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
开头表示年轻代中的Survior
E
开头表示的年轻代中的Eden
O
开头表示的老年代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
是一个非常轻量级的小工具,希望这篇文章对你查看内存占用有帮助。