android内存泄露小谈

  在做android的时候,用的语言大部分情况下都是java。以前最开始做的是编译器开发,

大部分情况都是用c语言和x86与arm架构的汇编,后来接触到ios用的是OC。对比之下,

感觉还是java用起来比较爽,真正的面向对象,(编译型与解释型的合体)跨平台性很强。

OC其实用起来也很舒服,才开始接触,就是觉得语法有点怪,熟悉之后,发现用起来很爽,

尤其是语言的动态性很强。当然c语言和汇编是最基础的语言,用他们可以对整个底层的系统

结构比较熟悉。

  c语言的内存完全是自己管理,没有按时释放内存,就会导致内存溢出。用的不当,会产生

悬空指针导致内存泄露。

 c语言的内存泄露基本上都是程序员没有注意释放造成。比如

   char *p = malloc(1024);

   p = malloc(1024);

这样就会导致前面分配的1024个字节产生内存泄露。

    像java与oc这两种面向对象的语言,在android开发和ios开发中产生的内存泄露,

大部分都是因为内存的回收机制(android是gc,IOS是ARC)加上用生命周期长的对象引用生命周期短的

对象造成的。

  android开发用的是java,java中有一套内存回收的机制gc。

      那么应该如何决定一个java对象应不应该回收,何时回收呢??

      java中的new出来的对象是存在于堆中。对象之间有引用于被引用的关系,这样通过这种关系可以把这种引用和被引用

表示成一个有向图。我们知道对象存在于堆中,但是对象是在线程中产生的。所以这个有向图的根顶点就是这个线程。当一个

对象的连通图的集合,从根顶点没有路径到达这个连通图的时候,那么这个连通图中的对象的集合,就应该被回收了。

    那么何时该回收这些没用的对象了,一般是在系统内存紧张的时候,当然也可以主动触发。

   通过上面的陈述,我们应该知道。能自己产生线程的东西很容易导致内存泄露。static关键字和单例的使用也容易产生内存泄露。。

  比如 handler,Asynctask,TimerTask、Thread、broadcast以及内部对象、Listener等容易和产生线程相关的东西用在对象中,很容易导致

这个对象出现内存泄露。

   

posted @ 2014-04-10 20:21  饮识止渴  阅读(207)  评论(0编辑  收藏  举报