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 内部类的使用,可以考虑使用静态内部类,使用弱引用来管理外部类的成员变量。
网友评论