依赖包中System.gc()导致Full GC
1、问题发现
Prometheus报警live服务的某个节点Old GC过多,需要排查。
2、问题分析
查看Prometheus,发现这个节点在11点18分到11点28分,仅仅10分钟内,进行了5次Full GC,根据经验(这样说可能有点扯淡),应该是某个特定接口导致的。
3、使用GCViewer分析GC日志
从图中可以看到,在发生Full GC的时间段内,老年代的使用不到200M,老年代的总大小为760多M。很显然,这个不是由于内存不够导致的。
4、查看GC原因
可以看到5次GC的原因都是System.gc()
,说明代码中调用了方法System.gc()
(当然可能是业务同学自己写的代码,也可能是依赖包中的)。
5、在ELK中查看该服务在该时间段内的调用情况
ELK日志显示可能是导出Excel导致(历史原因:严格来讲,线上服务不应该提供这种导出功能,这部分功能正在慢慢向大数据团队迁移,但是还没迁移完)
6、查看代码
根据日志信息查看代码发现确实是导出Excel操作导致,依赖包中的jxl.read.biff.WorkbookParser
类中,强制使用了方法System.gc()
进行GC。