【发布时间】:2018-05-10 03:34:37
【问题描述】:
我正在尝试学习如何识别和处理我的应用程序中的内存泄漏。我正在阅读此great article,但我对如何在 Android Studio 3.0 附带的新“Android Profiler”工具中应用它感到有些困惑。
我有一个测试应用程序,LeakCanary 指出我的应用程序存在内存泄漏。
事实上,当我运行分析器并按下“dump java heap”时,我可以看到我的 MyCollectionActivity 有 4 个实例,当我点击这些实例时,我可以看到详细信息:
但是文章中显示的工具有我在“Android Profiler”中看不到的选项:
我不会深入讨论如何导航巨大的内存堆。 相反,我会将您的注意力引向上方的分析器任务 下面截图的右上角。您所要做的就是检测 上例中引入的内存泄漏是为了检查Detect Leaked 活动,然后按播放以显示泄露的活动 在分析结果下。
例如,在新工具中,显示有泄漏实例的“分析器任务”和“分析结果”在哪里?
如果我们选择泄露的活动,我们会看到一个参考 保持活动活跃的引用可以是树 确定。通过寻找深度为零的实例,我们发现 位于位置管理器内的实例 mListener 是原因 我们的活动不能被垃圾回收。
Android Profiler 的图像也没有显示引用树,它显示了引用,但它似乎不是很有用。
【问题讨论】:
-
“在新工具中,例如,显示有泄漏实例的“分析器任务”和“分析结果”在哪里? - AFAIK,它不存在。如果您通过
Debug.dumpHprofData()从代码中捕获堆转储,IIRC,AS 3.0.1 将使用具有这些窗格的早期工具。 -
发生OutOfMemoryError时应该使用“dumpHprofData”方法吗?要查看谁在进行我的活动,我应该把这个电话放在哪里?
-
"出现OutOfMemoryError时应该使用那个"dumpHprofData"方法?" - 可能不会,因为那时您的环境将相当不稳定。 “要查看谁在举行我的活动,我应该把这个电话放在哪里?” ——好吧,LeakCanary 应该告诉你这一点。它使用此调用转储 HPROF 数据(我认为可以选择获取其 HPROF 文件,尽管我忘记了细节)。否则,在您认为您已经设置了泄漏场景之后,您可能会在仪器测试中调用
dumpHprofData()。
标签: android memory-leaks android-studio-3.0 leakcanary android-profiler