一次内存泄漏定位之旅
一、问题描述
我们自己写的软件,在常稳的压力测试中,大概每天会增长1G左右的内存,这个内存增加量是非常之巨大并且影响也是非常严重的。
二、基础知识准备
既然要定位内存泄漏,那肯定不能够直接凭眼睛看和屏蔽代码的方式,这样的效率低并且很大概率是找不到问题所在的,所以还是要依赖工具,下面就介绍一下基本工具使用:
1. valgrind(神器):这个工具堪称是内存泄漏定位神器,基本上linux设备上的内存泄漏都可以通过这个工具进行定位,但是这个工具有一个本身的缺陷就是它是在软件层面模拟了一个cpu 的core进行程序执行,程序执行过程中状态进行记录,所以这个工具执行就比较慢并且占用内存还是比较大,因此在一些内存不是很充裕系统上跑会相对比较慢,还有就是该工具内存泄漏报告要在程序退出时候才会生成,如果程序运行过程中持有大量内存而在退出时候被销毁也是侦查不出来的;
2. jemalloc(5.0): 这个工具是为了改进malloc频繁分配内存后导致内存碎片过多,致使后期内存分配速度慢问题,但是也集成了轻量级的内存泄漏定位方法,通过定期dump出heap分配调用栈,进行取样统计内存分配点,但是这个工具只能确定内存分配高频率调用栈,不能确定泄漏点,所以需要结合代码走读进行分析确认;
3. 通过代码修改确认内存增长规律和时间区间或者循环次数,进行代码删减缩小内存泄漏代码定位范围,从而确定内存泄漏点;
三、定位过程描述
由于此次的内存泄漏场景是长时间跑代码,将会出现较大量内存增长,所以第一步确认代码正常1-10次循环中是否会