如何使用分析器找到内存泄漏

时间:2017-12-18 13:31:48

标签: android memory-leaks profiling rx-java rx-android

我已经抛弃了大量的内存,并发现内存泄漏肯定存在。如果您查看屏幕截图,您会看到只有一个片段,但有9个相同类型的演示者。应该只有一个。当我检查其中一个演示者实例时,探查器会向我显示对演示者的引用。 这些都是RxAndroid方法的回调方法。我正在取消订阅片段的onDestroyView中的所有内容。仍然没有清理演示者实例(如您所见)。

所以我想知道如何区分有效(循环,内部)引用,它们仍然存在,因为对象仍然没有被垃圾收集,而且有问题的引用(导致对象不被清除)。

有人可以指导我如何找出可能发现内存泄漏的位置吗?

此触发是在触发GC后生成的! android memory dump

2 个答案:

答案 0 :(得分:1)

您应该从Square尝试 Leakcanary 一个开源库来检测内存泄漏。它可以帮助您避免进行大量的手动工作,例如

  • 采取hprof dump
  • 分析hprof转储以识别泄漏
  • 查找导致泄漏的参考
  • 修复并重复上述步骤

我有一个关于内存泄漏的博客& Leakcanary,you can find it here

答案 1 :(得分:0)

如果使用内存分析器强制进行垃圾收集,那么您就会知道正在使用的其他意外对象,因此它们可能是真正的泄漏而不仅仅是等待收集。 你需要找到gc root的路径,这将告诉你阻止其他人被垃圾收集的对象。

查看' Garbge Collection Roots'部分在这里获取更多信息。 Android内存分析器将告诉您到达gc根目录的最短跳数,但最好只捕获一个hprof并使用类似Eclipse MAT的内容来查看gc root的路径。 Eclipse MAT甚至可以为您检查泄漏。