三个方法帮助解决Android内存泄漏问题
最近自己遇到了好几个内存泄漏的问题,也帮同事解决了几个内存泄漏的问题记录一下
常用的检测内存泄漏有三个方法
1 Leakcanary工具检测
2 adb命令 adb shell dumpsys meminfo [package_name ] or [pid]
3 AS自带的内存监测工具
一 LeakCanary
LeakCanary的使用十分简单只要直接引用就可以了 新版本不再需要添加权限或在App内初始化
dependencies {
// debugImplementation because LeakCanary should only run in debug builds.
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4'
}
在Logcat中可以搜索到下面这句话即运行成功
D LeakCanary: LeakCanary is running and ready to detect leaks
可以自动检测以下所有已销毁但泄漏的实例
1⃣️ destroyed Activity
instances
2⃣️ destroyed Fragment
instances
3⃣️ destroyed fragment View
instances
4⃣️ cleared ViewModel
instances
LeakCanary总的来说是一个很有效而且集成简单的工具。但有时可能时效性不是那么快。适合集成在debug版本中做一个兜底保护。
leakcanary.png二 ADB命令
ADB命令相对AS自带的工具要稍微直观一点,相对LeakCanary时效性要好一些。
adb shell dumpsys meminfo [package_name] or [pid]
其中native和dalvik,dalvik就是java堆,普通java对象是在java堆分配,而bitmap是直接在native上分配,对于内存的限制是 native+dalvik 不能超过最大限制。android程序内存一般限制在16M或24M。
此外下面的objects可以帮助我们快速定位是View/Activity/Webview等一些经常发生泄漏的地方。
dumpsys.png三 Profile
AS里面自带的性能监控工具非常好使,其中一项可以帮助监控内存变化。
选择Memory一栏,再选中一段时间的区间。可以很清楚的看到相关细节,包括对象报名数量大小等。
遇到复杂的内存泄漏问题可以通过这个方式排查
as.png
网友评论