排查项目中遇到的内存泄露问题,用到valgrind工具,记录下具体的用法以及注意事项,以备后用。
首先要明确的是valgrind 是可靠的:刚开始使用valgrind测试出一些内存泄漏点,通过代码发现及日志跟
踪,发现流程上“没有问题”,一度怀疑valgrind 是不是报告假消息。后来所有报出来的泄漏点均证实确实
存在泄露。 下面介绍下valgrind基本使用方法:
如果系统没有安装valgrind,首先得安装下,我们测试的系统是Ubuntu16.04,直接 sudo apt-get install
valgrind 在命令行如下命令:
root@Ubuntu16:~# valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=./mem.txt ./CGServer
程序运行一段程序后结束程序运行,查看生成的文件(上面的命令指定了日志文件名为mem.txt),示例日志
文件内容 如下图所示:
图1. 示例日志内容
需要注意的是提示still reachable的地方 也有可能是泄露点。still reachable 原意是仍然可以被释放,如果是
库初始化处提示still reachable 没有问题,因为只有程序不退出,不能被释放。如果被反复调用的接口处也提示
still reachable 基本上都属于内存泄露,需要解决。
另外调用malloc分配的内存 free后内存不一定会立即交还操作系统,glibc有自己的内存管理机制。默认分配超
过128K的内存,free后会内存会立即交还操作系统(这个阈值可通过mallopt接口设置M_MMAP_THRESHOLD进
行修改)。小于128K先缓存起来,适当的时候释放。如果希望尽快释放内存可执行mall_trim(0)(可单独开启一个线
程定时执行该方法,该方法可释放本进程内其他线程free后的内存(交还操作系统))。 相比之下Windows系统下
内存释放没有这个问题调用free接口后一定是及时释放内存的。
linux下 查看程序占用的内存可通过 top -p 进程Pid 命令进行查看,整体上该命令输出的进程内存信息是准确的,
通过该命令查看进程内存如果进程占用内存一直增加 一定是有问题的。
如需交流可加QQ群766718184,1038388075 或者QQ3501870,
视频下载地址:http://www.chungen90.com/?news_3/
Demo下载地址: http://www.chungen90.com/?news_2