5

抛弃 leakcanary 使用 Android Profiler 进行内存泄露分析?

 2 years ago
source link: http://i.lckiss.com/?p=7013
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

抛弃 leakcanary 使用 Android Profiler 进行内存泄露分析?

2021-06-16

做 Android 的都知道,目前最流行的内存泄露检测工具就是 leakcanary ,其简单高效的集成方式,直观的结果,似乎非常好用,但实际上 Android Studio 4.2 (多次迭代后)中的 Android Profiler 也能实现同样的便捷。

打开 Android studio ,run 一个程序,点开底栏 Profiler 标签,连接上手机,在波浪般的界面效果中找到 MEMORY 。

双击进入子界面,在某个界面点击采集按钮:

在数秒过去后将会留下一段空白,即被采集的内存时段。该段会将该段展示到左侧作为标签显示,而 Android studio 也将会继续记录后面时段的内存,鼠标滑过即可导出对应时段的内存。

双击该白块,可看到该段内存的详情。在这里可以看到内存泄露提示以及搜索相关选项。

双击内存泄露文字按钮,将会看到被列出的相关类,同时还可以在上面筛选需要的类型的内存泄露。

2021061609282134.png

对于每个类的详细泄露路径,可在选中某个类后,通过再次点击 Leaks 文字按钮进行相关引用的查看。在存在多种泄露路径时,将会显示多条相关引用路径。

2021061609331393-1024x172.png

同时这里有一个 Show nearest GC root only 的 checkBox,到这里,看过 leakcanary 源码的童鞋应该就知道 leakcanary 实际上就是做了一个最短路径的计算。

当勾选上这个 checkBox 后,将只剩下一条最短的内存泄露路径,而这也最可能是内存泄露的原因,通过点击展开路径,查看相关变量名以及右键可以很好的跳转到相应的类,至此,也就完成了 leakcanary 所提供的功能。

leakcanary 检测范围相对较小,因为原理是对各生命周期对象的监听从而实现的销毁时的内存泄露检测,但也正因为如此 leakcanary 是自动的,通过生命周期销毁回调而触发的,不受特定时机限制。

Profiler 则需要自己手动的进行内存 dump ,而也正因为如此,Profiler 检测的面更广,提供的数据更多,同时直接集成在 Android studio 中,无需对项目进行修改。

所以,最好的方式是,对于一些困难的问题,先通过 leakcanary 进行触发时机的定位,再使用 Profiler 进行更详尽的分析。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK