依赖包中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。

posted @ 2019-09-18 14:18  萧亦全  阅读(1330)  评论(1编辑  收藏  举报