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

Posted cuizhiquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了依赖包中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。

以上是关于依赖包中System.gc()导致Full GC的主要内容,如果未能解决你的问题,请参考以下文章

GC 触发Full GC执行的情况

什么时候触发full gc?

full GC触发的条件

JVM-触发Full GC的情况

可能发生Full gc 的情况

JVM 什么时候会full gc