关于内存泄露

标签: 内存泄露 | 发表时间:2013-01-05 23:14 | 作者:星星
出处:http://duanple.blog.163.com

valgrind 详细说明  http://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111273.html

近期Imgsrc一处内存泄露问题的查找和解决  http://rdc.taobao.com/blog/cs/?p=1651

应用 Valgrind 发现 Linux 程序的内存问题 

https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/

如何在linux下检测内存泄漏


Linux on Power 上的调试工具和技术 

http://www.ibm.com/developerworks/cn/linux/l-pow-debug/#resources



让程序飞 之 内存工具:valgrind –tool=memcheck  http://blog.dccmx.com/2011/01/valgrind-massif/

Request to merge Google Address Sanitizer in gcc-4.8 


Valgrind 3.3 Advanced Debugging and Profiling

Debugging Memory Problems




内存泄漏的问题,在百度是遇到最多的,阿里相对少点。与内存泄漏斗争了很久,我总结下常用的一些有效测试方法吧。

1、valgrind,这是非常好用的工具,虽然参数很多,输出结果较多,但是只要认真看下,就很容易发现问题,报告是很详细的,不要被吓倒。valgrind检测的内存泄漏是非常准的,可以精确定位到代码行甚至是变量。valgrind基于valginrd core框架,这是个非常有强大的框架,他的作用不仅仅在于检测内存泄漏的,强烈建议测试新手通读下全部的文档。valgind自己也会有误报和漏报,所有具体场景需要具体分析。报告中一旦出现definitely lost的标记,就表示一定会有内存泄漏,泄漏的字节数也会报告出来,可以根据泄漏的内存大小和请求次数计算出到底是那个变量没有释放。

2、利用pmap+gdb,pmap可以列出特定进程的所有内存分配的地址和大小,通过gdb就可以直接看这些地址属于什么变量,通过统计这些内存地址的大小,就可以很容易的发现问题。利用自动化的gdb调试工具也可以很方便的定位。

3、其他的还包括memprof、商业工具Purify IBM出品,官方宣传说的不错,但是这种不开放的技术,在业界得不到认可,国内大公司一般那都不用,只有人傻钱多的公司在用。

4、利用一些trace工具,比如ptrace,strace之类的工具,这些trace工具会追踪特定的api,只需要统计malloc和free的调用次数就可以简单的发现是否有泄漏,但是无法定位代码行。另外还有一个更高深的工具,SystemTap,这个在国内应用还不多,但是非常厉害,可以方便hook程序的关键逻辑并插入探针。从而可以方便的检测内存泄漏。Systemtap目前还不通用,而且安装复杂,暂时不推荐使用,可以关注下,过几年可能会大规模应用。

valgrind是首选,因为他的设计就是为了解决所有的c++的内存问题。一些valgrind不能简单发现的,我一般会review代码,然后通过gdb自动调试技术来发现问题。通过valgrind+gdb,可以解决所有的内存泄漏。

另外,内存的泄漏也并不完全是没有及时的free,还有可能是其他的原因,比如设计问题等。需要靠一定的开发经验判断。
要尽量把静态测试和动态测试尽早的加入到持续集成中,以尽早的发现问题,不然一旦代码复杂,追查的成本就会增大。

相关 [内存泄露] 推荐:

关于内存泄露

- - 银河里的星星
valgrind 详细说明  http://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111273.html. 近期Imgsrc一处内存泄露问题的查找和解决  http://rdc.taobao.com/blog/cs/?p=1651.

ios Instruments 内存泄露

- - ITeye博客
虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在. 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的使用. 本文假设你已经比较熟悉Obj-C的内存管理机制. 实验的开发环境:XCode 4.5.2.

C++检查内存泄露

- - CSDN博客推荐文章
说明,我使用的ide是vs2008. 内存泄露的检测一般在debug模式下进行. 2.在需要检查内存泄露的cpp头部加上. 4.然后就可以在输出中看泄露情况了. 举个例子,例子中我用newEx表示的上述宏定义中的new. 输出中显示的内容(debug下运行程序,然后点叉叉关闭程序).   Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD .

Java的内存泄露

- - Java译站
Java有垃圾回收,因此不会出现内存泄露. 尽管Java的确有垃圾回收器来回收那些不用的内存块,但你不要指望它能够点铁成金. GC减轻了开发人员肩上的负担,而原本的那些工作非常容易出错,不过并不是所有内存分配的问题它都能够解决. 更糟糕的是,Java的设计允许它可以欺骗GC,使得它能够保留一些程序已经不再使用的内存.

ThreadLocal的内存泄露

- - zzm
ThreadLocal的目的就是为每一个使用ThreadLocal的线程都提供一个值,让该值和使用它的线程绑定,当然每一个线程都可以独立地改变它绑定的值. 如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal,这将极大地简化你的程序.. 关于的ThreadLocal更多内容,请参考《 ThreadLocal》.

Android 内存泄露总结

- - CSDN博客推荐文章
Android 内存泄漏总结. 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题. 内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收. 最近自己阅读了大量相关的文档资料,打算做个 总结 沉淀下来跟大家一起分享和学习,也给自己一个警示,以后 coding 时怎么避免这些情况,提高应用的体验和质量.

解决php内存泄露问题

- - 鲁塔弗的博客
这是08年写的一份文档,我当时在一家网站刚接手做技术负责人,网站每天大概有60万ip/300万pv的访问,网站产品很复杂,代码结构差,开发工程师来来去去,代码只能只读了. 突然有一天开始频繁出现php-fpm进程耗光内存和cpu占有率飙升,前端频繁出现504错误. php-fpm进程耗光内存 这个就是传说中的内存泄露,所谓内存泄露,是指进程在运行过程中,内存占用率逐步上升而不释放,导致系统可用内存越来越少的情况.

使用MAT分析内存泄露

- - Taobao QA Team
对于大型服务端应用程序来说,有些内存泄露问题很难在测试阶段发现,此时就需要分析JVM Heap Dump文件来找出问题. 随着单机内存越来越大,应用heap也开得越来越大,动辄十几G的Dump也不足为奇了. 要快速分析,快速定位问题就必须有给力的工具帮忙,下面我来介绍下常用内存分析工具. JDK自带的一个工具,是JVM Heap导出的必备工具.

c++内存泄露检测(简单)

- - CSDN博客推荐文章
C++ 的一个 比较晦涩难懂的特点是你可以重载 new 操作符,并且你甚至可以给它附加参数. 通常,操作符 new 只接受拟分配对象的大小:.   但你也可以随心所欲附加参数来重载 new 操作符,只要在调用 new 时候提供这些参数即可. 在各种应用程序向导(App Wizards)中,这 是 MFC 所做的事情.

如何查找Android内存泄露

- - HelloSure
eclipse中可以使用DDMS的heap视图来看data object的total size项. android studio中直接观察memory monitor. (Memory Monitor是android studio自带的,不需要额外安装,这个工具显然更直观一些). 个人觉得这种方式可以作为查找内存泄露的突破口,如果发现一些异常,比如抖动大说明GC频繁,或比如GC对内存释放不明显,或比如GC之后内存并没有稳定在一定的范围之内,则可能是有内存泄露问题,可以接下去分析.