1.什么是内存泄漏?
内存泄漏就是向系统申请内存使用,却不归还(释放),导致该内存既不能被自己使用也不能被别人使用。
2.内存泄漏和内存溢出有什么区别?
内存泄漏是分配出去的内存无法回收。
内存溢出是程序使用的内存超出了系统能给予的。
3.如何从测试数据中得出内存泄漏?
首先,我们需要使用性能测试工具去监控性能数据,android可使用GT.apk(下载地址:http://gt.tencent.com/)监控内存数据。然后,对测试对象连续重复做完全相同的操作多次。然后,将测试结果(内存)制作成折线图。如果几次完全相同的操作中,内存持续增长,那么可以判定内存泄漏。
4.导致内存泄漏的原因?
android内存泄漏的终极原因就是多线程程序反复申请释放内存,但是释放的和申请的不对应,导致吃内存。
详见宋宝华的博客http://blog.csdn.net/21cnbao/article/details/7706671。以下为博客原文:
内存泄露分为两种境界,一个是人死了,钱还没花完,你malloc的内存还没释放进程就死了,我们说,这个问题在Linux不存在,进程是个资源封装的单位,进程挂的时候,资源会被内核释放掉的,死的时候还仅仅有个僵尸而已。第二个境界是,人活着,钱没了,这个问题才是Linux真正担心的,一个多线程的程序,运行过程中反复申请和释放内存,但是释放的与申请的不对应,就慢慢地吃内存,这个进程的内存消耗曲线振荡上升,直到耗尽内存。所以,在Linux世界里,我们不用担心人死了,钱还没花完的问题
,党会帮我们处理的。我们要担心的是,人活着,钱没了的问题。
所以,能早结束的进程早点结束,多线程中该释放的内存尽早释放。
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.其他情况可参考这个博文,写的挺详细,我还没来得及看,看完之后再简单分析一下。