美文网首页
Android - 常见内存泄漏

Android - 常见内存泄漏

作者: ADMAS | 来源:发表于2019-04-10 11:03 被阅读0次

    单例

    单例静态对象持有activity引用,且因静态对象生命周期比activity还长,当act被销毁时,单例中的activity无法回收,造成内存泄漏

    解决方法:

    传入的context使用 applicationContext进行重新赋值,application的生命周期与单例一样长

    匿名内部类

    原因:匿名内部类持有外部类引用

    • handler
      创建匿名内部类handler,持有外部activity的引用,activity退出时,handler内部looper还在处理MessageQueue的消息,msg持有handler的引用,handler又持有activity的引用,造成内存泄漏

      解决方法:

      建立静态的handler类,类内部可以创建activity的弱引用(静态内部类只能访问外部静态成员,因此便不会持有外部的act引用)

    • 线程
      new thread() 以及new Runnable() ,退出activity后,当子线程操作尚未完成时,会导致内存泄漏

      解决方法:

      创建静态的内部类

    非静态内部类

    非静态内部类持有外部act引用,静态实例生命周期和应用一样长,act无法回收

    解决方法:

    使用静态内部类

    static 修饰的成员变量

    如果成员变量被声明为 static,其生命周期将与整个app进程生命周期一样。如果此变量持有activity的引用,则activity得不到释放

    Stream未关闭

    在调用了流之后,一定要记得关闭流。用到流的地方一般都是文件操作,虚拟机无法通过垃圾回收来释放这些资源。

    使用资源没有及时释放

    • brocastReceiver
    • cursor
    • bitmap
    • BrocastReceiver
    • file
    • contentProvider
    • Cursor
    • stream

    解决方法:

    退出activity时,及时释放

    常用的检测内存泄漏的工具

    Leakcanary: Square 公司开源的「Android 和 Java 的内存泄漏检测库」

    相关文章

      网友评论

          本文标题:Android - 常见内存泄漏

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