项目中集成 leakcanary-android
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
}
运行app 当发生内存泄漏时会显示一个弹窗 点击桌面app同名app可以看到内存泄漏引用链
此时若引用链看不出来可以dump 内存快照 adb shell am dumpheap xxxxxxxxx /data/local/tmp/xxxxxxxx.hprof
如上内存泄漏24次,点击第一个activity 可以看到loadApk中的mReceivers retained 过大此recivers是存储当前注册的reciver的map
正常清空每个reciver在注册之后需要在销毁时取消注册。 排查代码是否有reciver注册后未取消注册的情况。
activity中注册了reciver3次
取消注册reciver只有两次
此内存泄漏可以确认为未取消注册reciver的原因
总结写代码要仔细啊,如此低级的错误不应该出现。