ConcurrentLinkedQueue.remove导致内存泄漏的一次排查

275 阅读1分钟

由于导出的数据量较大,查询出的数据还需要做二次处理(再去数据库里查),比较耗时,所以开的多线程去处理

然后测试了几次之后,发现内存溢出了。。。

 

工具:jvisulvm(在jdk的bin目录下)

 

 

然后找到导致溢出的对象,可以直接对大小进行排序

 

 

正常情况下方法执行完后对象没有再被引用的情况下是会被gc的,但是我这里的实例数一直再增加

 

 

点击堆dump

 

 

 查找对象引用是被谁持有导致不能gc

 

 

 

 

 

 

 

 

反复注释代码后,发现问题出在了这一行代码

 

然后接着查资料,这一篇大致解释了ConcurrentLinkedQueue.remove()内存泄漏的原因

zhuanlan.zhihu.com/p/328416427