记一次线上生产fullGC的问题

397 阅读1分钟

记一次线上生产的问题

前因就是我写了一段代码,其实就是定时任务,轮询查询数据库表,看有没有过期数据,然后进行删除,原本代码逻辑已经写好了,现在就是新增了几张表,进行同样的操作,然后发现部署到生产环境就频繁出现,fullGc的问题。

解决过程

第一在,主管先让看看提交的代码是否有频繁创建对象的代码,在我多次检查之后,发现并没有,那么问题会是什么呢?

在经历了多次检查之后,我是用jdk自带的Java VisulaVM工具对堆内存,进行分析,发现系统中的日志对象,实例过多,占比将近70%,内存占用36%,日志使用的是log4j的DAsyncLoggerConfig,因为系统中内部的日志使用较多,而且其默认设置的RingBufferSize过大,在占用的内存过大,所以会频繁触发fullGc

知道了问题,我们就可以解决了,第一,我们可以通过配置jvm的参数-DAsyncLoggerConfig.RingBufferSize=50000 ,来减少日志实例的使用率,发现确实效果非常明显。

反思

在代码中,尽量不要频繁创建对象,类似for循环那种,单例模式,也能帮助我们很好的避免这些问题。