美文网首页
内存泄漏

内存泄漏

作者: Scofeild | 来源:发表于2018-04-18 17:23 被阅读13次

    1 单例的静态特性生命周期跟应用的生命周期一样长,一个场景(Context)不需要使用,那么会导致这个Context无法回收

      解决(private Context context;本方法内 set())

    2 非静态内部类 的 静态实例 (解决:把该内部类设为静态内部类)

      非静态内部类持有外部类的引用 容易导致内存泄漏

    3 Handler 造成的内存泄漏,Handler 向 looper的MessageQueue()发的Message 都会持有外部类的引用.

      当有未完成的消息,但是外部类已经销毁,而looper又是系统级周期,导致无法回收这个外部类,造成内存泄漏。

      (解决办法:使用静态内部类创建Handler(静态内部类不会持有外部类的引用),可以使用弱引用管理Handler)

    4 与Handler类似的还有 AsyncTask 和 Runnable 同上

    5 使用BroadCastRecevicer ContextObserver File Cursur Stream BitMap()等未关闭或者注销。

      Cursur File Stream 等一般都会设置一些缓存机制,所以要先关闭,后退出。

    6 使用ListView 构建BaseAdapter的时候 没有利用 ConvertView(一般现在用RecyclerView)

    7 容器(ArrayList等) 把一些对象的引用添加到集合,但Activity结束,没有Clear,并且置空。

    8 WebView(销毁时释放内存)

    9 一些静态集合传入一些类实例对象

    思考(避免内存溢出):

      1 生命周期的对比 Context 场景的引用 比如 showDialog 就需要 Activity 的 Context,创建一个单例就需要 Applaction的Context。

      2 静态内部类需要使用外部类的成员,使用弱引用来管理外部成员(Context View)。

      3 内部类的使用,可以考虑使用静态内部类,使用弱引用来管理外部类的成员变量。

    相关文章

      网友评论

          本文标题:内存泄漏

          本文链接:https://www.haomeiwen.com/subject/athbkftx.html