2017-12-18 390 views
1

我已经抛弃了大量的内存,并发现存在内存泄漏。如果你看截图,你会看到只有一个片段,但有9个相同类型的演示者。应该只有一个。当我检查一个演示者实例时,分析器向我显示对演示者的引用。 这些都是RxAndroid方法的回调方法。我正确地取消了在片段的onDestroyView中的所有这些。不过,演示者实例并未被清理(如您所见)。如何找到配置文件的内存泄漏

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

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

该转储是在触发GC之后生成的! android memory dump

+3

你试过L eakCanary已经? https://github.com/square/leakcanary – Kriczer

+0

我对LeakCanary看得不够深入 - 现在会这样做...... – stoefln

+0

您在哪里存储这些对象的“订阅”?调用'取消订阅'是不够的,你不得不'去掉任何引用。或者,使用'onTerminateDetach'。 – akarnokd

回答

0

如果强制垃圾收集使用内存设置,那么你知道你看到更多的意想不到的对象也有使用,因此有可能他们是真正的泄漏,而不是等待被收集。 您需要找到gc root的路径,这会告诉您保持其他人不被垃圾收集的对象。

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

1

您应该尝试Leakcanary Square的开源库检测内存泄漏。这样可以节省你从做大量体力劳动的像

  • 以HPROF转储
  • 分析HPROF转储,以确定泄漏
  • 导致泄漏
  • 修复和重复以上
  • 查找参考步骤

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

+0

泄漏金丝雀帮助发现2个泄漏。但它没有检测到第三次泄漏:我使用supportFragmentManager而不是childFragmentManager。 – stoefln