一次FullGC问题的定位

问题背景

一次在查看服务器的gc状态的时候发现,fgc的次数过高(200多次)且远大于ygc(3次),在线上环境和测试环境都有同样的现象,长时间的观察发现ygc的次数基本不变,fgc隔段时间后就会增加一次(ygc的平均时间:27ms, fgc的平均时间:58.28ms, 因为内存几乎没什么数据,fgc的时间不是很特别长)
一次FullGC问题的定位

问题分析

查看服务器启动期间在线人数和内存使用情况,可以看到在线人数很少,且内存的占用很低,排除内存泄露导致的JVM内存占用过高而触发fgc的原因
一次FullGC问题的定位
通过jstat -gccause 查看gc的lgcc参数值可以看到上一次gc是System.gc触发导致的,而ygc没变化过,所以是system.gc导致了fgc
一次FullGC问题的定位
项目应用层确认没有调用System.gc, 参考以下资料,考虑是第三方库的调用,网上搜索找到一些线索
一次FullGC问题的定位一次FullGC问题的定位
参考文章【每小时一次定时FullGC问题解决】与我们现象类似,猜想是rmi的导致的。

问题定位

线上环境服务器启动时间251~252个小时 fgc刚好251次;测试环境服务器启动时间14个小时 fullGc刚刚14次
得出的结论是fgc的频率是每小时1次,与上述文章的场景非常类似,本地断点测试,看到一次fgc调用的System.gc时的调用栈
一次FullGC问题的定位
由此确定是rmi导致fgc