一、背景
最近改了好多代码做优化,然后线下测试发现很不符合预期,表现如下:
跑一段时间,内存占用越来越大
一种怀疑内存泄漏,查询了一下午,终于定位,其实是性能回退问题,特别写下mark下
二、排查简述
- 任务回收内存是通过异步线程池
- 基于监控项,发现异步线程池堆积任务持续增加,因此导致内存增大,不能及时释放
- 基于现有监控项+撸了几遍代码,很难找到为啥堆积,继续丰富监控项,详细描述了到底堆积了什么任务,类似如下:
taskA多少个,taskB多少,taskC多少个。。。
发现其中A堆积最大,占用总任务个数的百分95。继续看代码,感觉A消费没什么瓶颈点。 - 想了半天,灵光一闪,也有少量B和C,是不是因为B和C消费太慢,导致卡住A
- 加日志验证,发现确实B和C耗时增大10倍以上
- 继续看各个模块代码,定位原因: 使用基于hazind value 实现的并发hash map,本身get和revert应该成对调用,前面有一个模块,只get但是没有revert,导致链越来越长,而回收B和C,会get该数据结构,导致跑的时间越久->get越慢->回收速度越慢->影响其他任务回收->内存占用大
三、小结
少写一行代码浪费了一下午,mark下~~