记一次排查内存泄露经历

最近我们有个线上服务,经常是过一段时间就突然不行了,服务调用超时,重启服务就又好了,往返几次,我决定要排查一下这个服务看看有什么问题

排查经过

昨天下午发现该服务时行时不行,打开监控发现服务多次gc,明显不正常。

记一次排查内存泄露经历_第1张图片

  可以看到最下面的服务已经不干活了,没有任何请求打入。

记一次排查内存泄露经历_第2张图片

进一步看该副本状态

记一次排查内存泄露经历_第3张图片

记一次排查内存泄露经历_第4张图片

记一次排查内存泄露经历_第5张图片

 可以看到内存已经到最大内存的极限了,基本上一直在gc

通过运维dump出来的日志发现,内存存储了大量的sql,全都是放在map里,释放不掉,频繁导致内存泄露

记一次排查内存泄露经历_第6张图片

 通过定位发现这个druid连接池如果打开sql监控的话会导致druid长期持有sql,在某些特殊场景下 大批量更新sql可能就会导致服务oom了

解决方案

每个sql语句都会长期持有引用,加快FullGC频率 · Issue #1664 · alibaba/druid · GitHub

直接关闭sql监控 
spring.datasource.druid.filter.stat.enabled=false
 
  

你可能感兴趣的:(事故解决,java,java,jvm,开发语言)