【问题标题】:How to treat memory leaks using the new AndroidProfiler如何使用新的 AndroidProfiler 处理内存泄漏
【发布时间】: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


【解决方案1】:
  1. 首先,您需要保存 堆转储。带有扩展名 hprof 的转储保存。检查下面附加的图像以保存此文件。
  2. 在 Android Studio 中打开同一个文件,之后,您将能够在右上角看到 Analyser Tasks 选项。

【讨论】:

  • 在导出堆转储时不要伪造在文件名末尾添加 .hprof。例如:test.hprof
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2017-08-11
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多