您的位置:首页 > 移动开发 > Android开发

android性能测试之内存泄漏

2014-07-21 00:00 190 查看

1.什么是内存泄漏?

    内存泄漏就是向系统申请内存使用,却不归还(释放),导致该内存既不能被自己使用也不能被别人使用。

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

   内存泄漏是分配出去的内存无法回收。
   内存溢出是程序使用的内存超出了系统能给予的。

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

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

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

   android内存泄漏的终极原因就是多线程程序反复申请释放内存,但是释放的和申请的不对应,导致吃内存。
    详见宋宝华的博客http://blog.csdn.net/21cnbao/article/details/7706671。以下为博客原文:
   
内存泄露分为两种境界,一个是人死了,钱还没花完,你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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息