我已经倾倒了大量内存并发现确实存在内存泄漏。如果您查看屏幕截图,您会发现只有一个片段,但是有9个相同类型的presenter。应该只有一个。当我检查其中一个presenter实例时,分析器会向我显示presenter的引用。这些都是RxAndroid方法的回调方法。我在Fragment的onDestroyView中正确取消了所有这些订阅。尽管如此,presenter实例仍未清除(如您所见)。因此,我想知道如何区分有效(循环,内部)引用,这些引用仅因为对象仍未垃圾回收而存在,以及有问题的引用(导致对象无法清除)。有人能指导我如何找出可能存在内存泄漏的地方吗?此转储是在触发GC之后生成的!
你应该尝试使用来自Square的开源库Leakcanary来检测内存泄漏。它可以帮助你避免进行大量手动操作,例如: 获取 hprof dump 分析 hprof dump 以识别泄漏 查找导致泄漏的引用 修复并重复上述步骤 我有一篇关于内存泄漏和 Leakcanary 的博客,你可以在这里找到它。
如果您使用内存分析器强制进行垃圾回收,则知道在那里看到的额外未预期对象正在使用,因此可能它们是真正的泄漏,而不仅仅是等待被回收。您需要找到gc根路径,这将告诉您哪个对象使其他对象无法被垃圾回收。在此处查看 'Garbge Collection Roots' 部分以获取更多信息。Android内存分析器将告诉您到达gc根所需的最短跳数,但最好捕获hprof并使用像Eclipse MAT这样的工具来查看到gc根的路径。Eclipse MAT甚至可以为您检查泄漏。