缘起
很早之前看过leakcanary的源码,应该是自己看的第一个框架源码,但当时知识不扎实,并没有吃透。最近看到分析这个框架的视频,于是记录下学习内容。
基础知识
四种引用
1 强引用
2 软引用,softReference,内存不够时回收。
3 弱引用,weakReference GC时回收。
引用队列 ReferenceQueue
可以保存弱引用和软引用
对象被回收时,JVM将这个引用放到与之相关联的引用队列中。
流程
- 首先创建一个RefWatcher,启动一个activityRefWatcher。
- 通过activityLifecycleCallBack 将activity的onDestroy相关联。
- Activity onDestroy之后将它放在一个weakReference 中。
- 将这个reference放到一个ReferenceQueue中。
- 查看ReferenceQueue是否存在activity的引用。
- 如果该activity泄露了,dump出heap信息,然后分析泄露路径
- 在线程池中去开始分析内存泄露。
OOM
1 单例造成的内存泄露
TODO: 将传入的context改成使用applicationcontext.
2 非静态内部类创建静态实例造成的内存泄露。非静态内部类持有外部类对象,而静态变量的生命周期与应用的生命周期一致。
TODO:非静态内部类改成静态内部类
3 handler 造成的内存泄露
TODO:1 将hanlder声明为静态,2 通过弱引用的方式引入activity
4 线程造成的内存泄露
TODO:静态内部类
5 webview造成的内存泄露
TODO:放在单独的进程,退出界面时及时销毁。
网友评论