jstat主要用来查看当前java进程的各内存区域的使用情况以及GC的次数和总耗时。我最常用的是下面的命令:
jstat -gcutil <pid> [interval] [times]
可以用[interval]
来控制每隔多少毫秒重复输出一次,并通过[times]
参数来控制输出的总次数。这两个参数都是可以省略的,如果都省略的话,就只输出一次。
下面举例说明以下,输出pid=53560的java进程的内存各区域的利用率,每隔1000毫秒输出一次,共输出五次。
$ jstat -gcutil 53560 1000 5
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 100.00 4.96 3.23 95.51 93.53 6 0.084 0 0.000 0.084
0.00 100.00 4.96 3.23 95.51 93.53 6 0.084 0 0.000 0.084
0.00 100.00 4.96 3.23 95.51 93.53 6 0.084 0 0.000 0.084
0.00 100.00 4.96 3.23 95.51 93.53 6 0.084 0 0.000 0.084
0.00 100.00 4.96 3.23 95.51 93.53 6 0.084 0 0.000 0.084
我会重点关注是FullGC的次数和总时间。FGC是FullGC的次数,FGCT是FullGC的总耗时(s)。
另外,简单解释下其它列的含义
以上三个区域合在一起就是新生代了。
如果你想关注各个内存区域的具体大小,而不仅仅是百分比,可以使用jstat -gc
,用法相同,例如
$ jstat -gc 53560 1000 5
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 13312.0 0.0 13312.0 1156096.0 57344.0 927744.0 29959.0 62976.0 60147.5 8448.0 7901.7 6 0.084 0 0.000 0.084
0.0 13312.0 0.0 13312.0 1156096.0 57344.0 927744.0 29959.0 62976.0 60147.5 8448.0 7901.7 6 0.084 0 0.000 0.084
0.0 13312.0 0.0 13312.0 1156096.0 57344.0 927744.0 29959.0 62976.0 60147.5 8448.0 7901.7 6 0.084 0 0.000 0.084
0.0 13312.0 0.0 13312.0 1156096.0 57344.0 927744.0 29959.0 62976.0 60147.5 8448.0 7901.7 6 0.084 0 0.000 0.084
0.0 13312.0 0.0 13312.0 1156096.0 57344.0 927744.0 29959.0 62976.0 60147.5 8448.0 7901.7 6 0.084 0 0.000 0.084
列差不多,只是将百分比一分为二了,C结尾的表示总容量(Capacity),U结尾表示已使用的量(Utilization)。单位是KB。
更详细的文档,请参考 oracal官网链接