C++ 项目之中的一些内存泄漏处理


1,首先使用sar/top/free在系统级确定是否有内存泄露。如有,可以从top输出确定哪一个process。

2,pmap/top/ps工具是能帮助确定process是否有memory leak。确定memory leak的原则:

A)VIRT/VSZ或者writeable/private (‘pmap –d’输出)如果在做重复的操作过程中一直保持稳定增长,那么一定有内存泄露。
B) RSS只能作为参考,不能用来确定是否有内存泄露。
C) 在performance testing过程中,前面一段时间的内存增长不能用来确定内存泄露。因为最初系统需要申请一些内存来处理traffic。如果内存在短期就增长数G或者在系统稳定后还在持续增长,那就需要分析了。在我的工作中,一般前面半个小时的内存增长我都忽略。
D) 我们会发现,VSZ或者其他增长以后即使你调用了free/delete也不一定会减少或者回复到初始水平。这是系统的正常行为,释放的那一部份空间马上就能重用。
E)多次申请分配的地址空间可能不连续。在virtual address中有多个[anon]段。 Here 1M was alloated to000000001b56a000    and00002ac25a77c000.   

3.最好还是使用工具
while true; do pmap -d 3066 | tail -1; sleep 2; done

pmap -d 3050
输出:00007fc72fa99000   10660 rw--- 0000000000000000 000:00000   [ anon ]
查找方法:
1. strace -tt -T -p 3050
     只看系统调用看不出来问题
2. 添加日志,这是个漫长任务
3. 回退版本,确定初步范围.

最好是用工具valgrind

http://valgrind.org/downloads/current.html#current  用法百度一下就可以。

  1. /configure
  2. make
  3. sudo make install
    一般都是要安装的。

猜你喜欢

转载自www.cnblogs.com/xlsss159/p/10361070.html
今日推荐