依赖包中System.gc()导致Full GC

柔情痞子 提交于 2020-04-27 22:40:10

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。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!