• 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等容易和产生线程相关的东西用在对象中,很容易导致

    这个对象出现内存泄露。

       

  • 相关阅读:
    HTTP协议详解
    如何编写出拥抱变化的代码
    Cookie ,Session
    Request 请求
    MySQL如何处理死锁
    如何优化冒泡排序
    java数据结构分析
    response响应
    Tomcat服务器
    HTTP协议
  • 原文地址:https://www.cnblogs.com/lzl-sml/p/3657311.html
Copyright © 2020-2023  润新知