Android 记一次内存泄漏分析

209 阅读1分钟

项目中集成 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

148ef0ab2719483ba654622be40a4f3c.png

如上内存泄漏24次,点击第一个activity 可以看到loadApk中的mReceivers retained 过大此recivers是存储当前注册的reciver的map

正常清空每个reciver在注册之后需要在销毁时取消注册。 排查代码是否有reciver注册后未取消注册的情况。

activity中注册了reciver3次 a773a1048ce24c649d31c5efb0e4e9fe.png

取消注册reciver只有两次 9047c964611f463ebf60be0389d91268.png 此内存泄漏可以确认为未取消注册reciver的原因

总结写代码要仔细啊,如此低级的错误不应该出现。