内存泄漏知识点

memory leak :程序运行申请了内存,但该内存不使用时却无法释放,就造成了内存泄漏

结果:会造成app的oom 内存溢出,crash崩溃

原因:jvm无法进行gc回收内存,因为无意识地持有了对象引用 持有引用者生命周期大于被引用者的生命周期

常见的几种状况:
1.集合类 : 集合类内部元素释放,但是集合类对象仍然被引用,造成泄漏
2.static关键字修饰的成员变量
static修饰的成员变量引用资源耗费过多的实例(如mContext), 如需引用,最好引用application的context (单例模式中经常发生)
3.非静态内部类或匿名类
3.1外部类持有非静态内部类的静态对象
解决方案:1,内部类变为静态内部类 2,尽量避免使用创建非静态内部类的实例为静态对象 3,将该内部类抽出封装成一个单例
3.2 多线程:AsyncTask、实现Runnable接口、继承Thread类
原因:工作线程持有外部类的引用、工作线程的生命周期大于外部类的生命周期
解决方案:1,将线程类置为静态内部类 2,外部类destroy时强制结束线程
3.3 Handler
handler使用时,其非静态内部类\匿名类属性会默认持有外部类的引用,而handler中可能存在未执行完的message,导致handler持有activity引用
解决方案:1.activity在destroy时清空handler中未执行或执行中的callback和message。 2,静态内部类+弱引用 3,被动方法,等hangdler处理完所有消息,下次GC即可回收未本次回收的内存
4.资源对象使用后未关闭
activity销毁时未注销相关资源(广播,文件流file,数据库游标cursor,图片资源bitmap等)
5.其他状况(webview,listview adapter等)

posted @ 2021-01-28 19:24  马叉虫啊  阅读(50)  评论(0)    收藏  举报