前言
最近遇到一个Jvm old过高的案例,现象是一个站点的jvm old区过高,分析原因是,原来的设计方案有问题,给前端返回的数据里面包含了大量的html代码,从存储中拿数据的过程、拼接数据的过程过于漫长了,造成了大量对象的生命周期过长,对象被 标记到了old中,造成了old区过高,监控系统进行了报警,详细原因就不做详细分析了,主要分享一下问题排查的过程。
收到了监控系统的报警,在服务器上查询jvm内存情况
jstat -gcutil pid 时间间隔,可以按时间间隔打印jvm的内存情况,例如:
jstat -gcutil 30922 1000
jvm进程30922的内存情况
大致说一下,S0,S1这些的含义:
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E: 年轻代中Eden(伊甸园)已使用的占当前容量百分比
O: old代已使用的占当前容量百分比
P: perm代已使用的占当前容量百分比
YGC: 从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC: 从应用程序启动