三个方法帮助解决Android内存泄漏问题

三个方法帮助解决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

你可能感兴趣的:(三个方法帮助解决Android内存泄漏问题)