1.什么是内存泄漏?




2.内存泄漏和内存溢出有什么区别?




3.如何从测试数据中得出内存泄漏?


   首先,我们需要使用性能测试工具去监控性能数据,android可使用GT.apk(下载地址: http://gt.tencent.com/)监控内存数据。然后,对测试对象连续重复做完全相同的操作多次。然后,将测试结果(内存)制作成折线图。如果几次完全相同的操作中,内存持续增长,那么可以判定内存泄漏。


4.导致内存泄漏的原因?

内存泄露分为两种境界,一个是人死了,钱还没花完,你malloc的内存还没释放进程就死了,我们说,这个问题在Linux不存在,进程是个资源封装的单位,进程挂的时候,资源会被内核释放掉的,死的时候还仅仅有个僵尸而已。第二个境界是,人活着,钱没了,这个问题才是Linux真正担心的,一个多线程的程序,运行过程中反复申请和释放内存,但是释放的与申请的不对应,就慢慢地吃内存,这个进程的内存消耗曲线振荡上升,直到耗尽内存。所以,在Linux世界里,我们不用担心人死了,钱还没花完的问题 ,党会帮我们处理的。我们要担心的是,人活着,钱没了的问题。


   不了解进程和线程的童鞋可以参考此文章,非常 简单明了 :   http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

5.如何避免内存泄漏?

   1.长期保持了context对象的引用。可参考官方博客: http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html


      引用译文:在Android应用程序中,很多操作都用到了Context对象,但是大多数都是用来加载和访问资源的。这就是为什么所有的显示控件都需要一个Context对象作为构造方法的参数。在Android应用程序中通常可以使用两种Context对象:Activity和Application。当类或方法需要Context对象的时候常见的作法是使用第一个作为Context参数。但这就意味着View对象对整个activity保持引用,因此也就保持对activity内的所有东西的引用,也就是整个View结构和它所有的资源都无法被及时的回收,而且对activity的长期引用是比较隐蔽的。

   2.其他情况可参考这个博文,写的挺详细,我还没来得及看,看完之后再简单分析一下。

        Android之内存泄漏调试学习与总结 http://mzh3344258.blog.51cto.com/1823534/895093