1,如何发现内存泄露
内存泄露本质是长生命周期的对象引用了短生命周期对象,导致短生命周期对象内存空间不能及时回收。
LeakCanary在 Activity里销毁的时候,将activity实例放入弱引用中,再将弱引用放入引用队列中,然后执行gc,最后检测引用队列中是否有activity实例,如果有说明发生了内存泄露。
弱引用,就是gc后就回收。软引用是内存不足才回收。强引用是不回收。既然gc之后,弱引用里面的activity实例没有被销毁,说明还有对象引用activity实例。也就是内存泄露了。
2,如何找出哪里泄露了?
到底是哪里发生了内存泄露?也就是到底谁引用了activity实际,去分析hprof文件就可以了。LeakCanary内存开启IntentService去这件事,找到以后就弹出泄露界面。