排查过程
线上一台服务器从周一下午开始告警,告警内容为“Full GC比较频繁”。一开始大家都没有在意,猜想可能是部分业务压力有点大了,等高峰期过了就好了。
然而告警邮件的提醒一直响到了第二天。
周二中午,脆骨首先开始了排查,登录跳板机后,通过jstat工具查看GC情况,发现该应用的老年代占用100%,大约每5秒触发一次Full GC,但Full GC后没有效果,老年代占用依然为100%,据此我们推测应该是有大量业务对象滞留在了内存中。我们开始第一次尝试使用jmap来dump堆,以期通过分析堆中的对象来定位问题,然而第一次仅dump出18M的内容,分析后没有发现有价值的内容,考虑到老年代长期占用100%已经使得该应用无法正确响应线上请求了,我们重启了该应用,观察启动后的GC情况是正常的。
周二晚上下班后,我和脆骨再次登录服务器排查该问题。21时11分,应用日志显示有一家店启动了某一类型的活动,接下来的几分钟里,应用的老年代占用率迅速上升,并导致开始频繁Full GC,告警邮件也再次出现。到此我们初步确定了问题是由该类型的活动导致的,并第二次使用jmap将堆dump出来进行分析,这次成功dump出4.3G的hprof文件。