命令格式
jstat命令命令格式:
jstat [Options] vmid[interval] [count]
参数说明:
Options,选项,我们一般使用 -gcutil 查看gc情况
vmid
,VM的进程号,即当前运行的java进程号
interval
,间隔时间,单位为秒或者毫秒
count
,打印次数,如果缺省则打印无数次
示例说明
示例
通常运行命令如下:
jstat -gc 12538 5000
即会每5秒一次显示进程号为12538的java进成的GC情况,
显示内容如下图:
结果说明
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C
:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U
:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U
:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC
:年轻代中Eden(伊甸园)的容量 (字节)
EU
:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC
:Old代的容量 (字节)
OU
:Old代目前已使用空间 (字节)
PC
:Perm(持久代)的容量 (字节)
PU
:Perm(持久代)目前已使用空间 (字节)
YGC
:从应用程序启动到采样时年轻代中gc次数
YGCT
:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC
:从应用程序启动到采样时old代(全gc)gc次数
FGCT
:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT
:从应用程序启动到采样时gc用的总时间(s)
NGCMN
:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX
:年轻代(young)的最大容量 (字节)
NGC
:年轻代(young)中当前的容量 (字节)
OGCMN
:old代中初始化(最小)的大小 (字节)
OGCMX
:old代的最大容量 (字节)
OGC
:old代当前新生成的容量 (字节)
PGCMN
:perm代中初始化(最小)的大小 (字节)
PGCMX
:perm代的最大容量 (字节)
PGC
:perm代当前新生成的容量 (字节)
S0
:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1
:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E
:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O
:old代已使用的占当前容量百分比
P
:perm代已使用的占当前容量百分比
S0CMX
:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX
:年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX
:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS
:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT
: 持有次数限制
MTT
: 最大持有次数限制
本文主要分析一个频繁GC (Allocation Failure)及young gc时间过长的case。
jdk版本
这里使用的是java8,参数没有明确指定metaspace的大小和上限,查看一下
相关参数
这里可以到full gc的reason是Ergonomics,是因为开启了UseAdaptiveSizePolicy,jvm自己进行自适应调整引发的full gc
分析完full gc之后我们看下young gc,看log里头99%都是GC (Allocation Failure)造成的young gc。Allocation Failure表示向young generation(eden)给新对象申请空间,但是young generation(eden)剩余的合适空间不够所需的大小导致的minor gc。
gc之后survivor有对象的例子
从上面的分析可以看出,young generation貌似有点大,ygc时间长;另外每次ygc之后survivor空间基本是空的,说明新生对象产生快,生命周期也短,原本设计的survivor空间没有派上用场。因此可以考虑缩小下young generation的大小,或者改为G1试试。
关于-XX:+PrintTenuringDistribution有几个要点,要明确一下:
1、用gcLogViewer分析gc.log,记录下FullGC的几个点,再到gc.log中具体去看那段时间的gc情况,一般就可以分析出FullGC的原因。2、如果FullGC很频繁的话,也可以直接在服务器上通过jstat观察,对于反射调用特别多这种情况,建议注意看看PermGen的增长是不是FullGC的原因,如果是的话,开大PermGen,或者使用CMS方式对PermGen进行回收。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)