驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
JDK带的小工具 jstat中的 2 个实用参数
/  

JDK带的小工具 jstat中的 2 个实用参数

开篇

前段时间,发现线上某台服务器应用宕机了,分析了dump的内存占用信息,并未发现异常。再去翻看日志的时候,发现了大量的MetasapceOOM,并且触发了多次Old GC,最后服务宕机。重启服务后,第二天又有一台服务器出现类似情况,当时服务还没有宕机,这里记录下当时用到的关于jstat的指令。

正文

jstatjdk自带的小工具,非常好用,这里记录 2 个非常有用的指令

  • jstat -gc pid
  • jstat -gcutil pid

gc

先谈谈第一个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

这个数据不好看,我这里将其格式化一下:

S0CS1CS0US1UECEUOCOUMCMUCCSCCCSUYGCYGCTFGCFGCTGCT
0112640112648151047116801270784366371.4260352230441.13200026848.457712.0020012.002

上述转换利用到了如下 2 个小工具,非常推荐使用

  • excel的分隔处理,按照空格分隔接口
  • 数据转换 处理为markdown

上面的数据可以通过如下几个维度解读

第一个维度:UC结尾

  • C结尾的表示Capacity`,代表的是总共的容量
  • U结尾的表示Used,代表使用容量

第二维度:什么开头

  • S开头表示年轻代中的Survior
  • E开头表示的年轻代中的Eden
  • O开头表示的老年代
  • M开头表示的Metaspace,元数据
  • YG开头表示的是年轻代的垃圾回收
  • FG开头表示的全GC

那么综上:

  • S0 :年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
  • S1 :年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
  • E :年轻代中Eden(伊甸园)已使用的占当前容量百分比
  • O :old代已使用的占当前容量百分比
  • P :perm代已使用的占当前容量百分比
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
  • FGC :从应用程序启动到采样时old代(全gc)gc次数
  • FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

gcutil

该指令更加强调百分比占比,可以直观的出占用率,比如

# 指令
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

我们还是格式化下吧。

S0S1EOMCCSYGCYGCTFGCFGCTGCT
010069.8528.8388.5183.957712.0020012.002

上述数值的前几个都是百分比信息:

  • E69.85,表示的就是Eden区已经占用了69.85%
  • O28.83,表示的是Old区已经占用了28.83%
  • M88.51,表示的就是Metaspace区已经占用了88.51%

后面的几个参数

  • YGC表示的Young GC的次数
  • YGCT表示的Young GC Time 就是YGC消耗的时间
  • FGCFGCT同理表示的Full GC的相关信息
  • GCT表示的Global GC Time 整个垃圾回收暂用的时间。

结语

jstat是一个非常轻量级的小工具,希望这篇文章对你查看内存占用有帮助。

积土成山,风雨兴焉。积水成渊,蛟龙生焉。