美文网首页
内存泄漏解析

内存泄漏解析

作者: 瞬息之李 | 来源:发表于2017-08-30 20:09 被阅读0次

    常识

    1. 非静态内部类(包括匿名内部类:)默认会持有外部类的引用
    2. 静态内部类不会持有外部类的引用
    3. 静态存储区(存储静态数据,全局的static数据),在程序运行中,它都存在

    情况一:
    在单例模式中,使用的是静态的对象,所以该对象不能引用生命周期比他短的实例(比如activity的context),要保证他持有的对象跟他自己的生命周期一样长

    情况二:使用非静态内部类创建静态实例
    非静态内部类会持有外部类的对象,而再用此非静态内部类去创建了静态的对象,静态对象生命周期跟app的生命周期一样长,这就导致外部类释放不掉

    实例

    1. handle使用:handle是一个匿名内部类,所以使用它时默认会持有外部类的对象(activity),当外部引用(如activity)提前销毁时,但是handle还没有处理完全部消息时,就会造成内存泄漏。所以一般都将handle设为静态内部类,这样就不会引用外部类,但是如果需要使用外部类的对象时,可以将其设为软引用,方便gc回收

    2. asynTask和runnable : 都属于匿名内部类,如果外部的引用提前销毁了(如activity),但是asyntask的任务还没有执行完,则会造成内存泄漏。所以默认都设置为静态内部类,要使用外部对象时,将其设置为软引用,方便gc回收

    3.资源未释放造成的内存泄漏,如注册与取消注册问题,bitmap的回收等等。

    相关文章

      网友评论

          本文标题:内存泄漏解析

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