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

3
我已经倾倒了大量内存并发现确实存在内存泄漏。如果您查看屏幕截图,您会发现只有一个片段,但是有9个相同类型的presenter。应该只有一个。当我检查其中一个presenter实例时,分析器会向我显示presenter的引用。
这些都是RxAndroid方法的回调方法。我在Fragment的onDestroyView中正确取消了所有这些订阅。尽管如此,presenter实例仍未清除(如您所见)。
因此,我想知道如何区分有效(循环,内部)引用,这些引用仅因为对象仍未垃圾回收而存在,以及有问题的引用(导致对象无法清除)。
有人能指导我如何找出可能存在内存泄漏的地方吗?
此转储是在触发GC之后生成的! android memory dump

3
你已经尝试过LeakCanary了吗? https://github.com/square/leakcanary - Kriczer
我没有深入研究过LeakCanary-现在会这样做... - stoefln
你把这些对象的“Subscription”存储在哪里?调用“unsubscribe”是不够的,你必须将任何引用都设置为“null”。或者,使用“onTerminateDetach”。 - akarnokd
2个回答

1

你应该尝试使用来自Square的开源库Leakcanary来检测内存泄漏。它可以帮助你避免进行大量手动操作,例如:

  • 获取 hprof dump
  • 分析 hprof dump 以识别泄漏
  • 查找导致泄漏的引用
  • 修复并重复上述步骤

我有一篇关于内存泄漏和 Leakcanary 的博客,你可以在这里找到它


Leak Canary 帮助找到了 2 个泄漏。但它没有检测到第三个泄漏:我使用了 supportFragmentManager 而不是 childFragmentManager。 - stoefln

0
如果您使用内存分析器强制进行垃圾回收,则知道在那里看到的额外未预期对象正在使用,因此可能它们是真正的泄漏,而不仅仅是等待被回收。
您需要找到gc根路径,这将告诉您哪个对象使其他对象无法被垃圾回收。
在此处查看 'Garbge Collection Roots' 部分以获取更多信息。Android内存分析器将告诉您到达gc根所需的最短跳数,但最好捕获hprof并使用像Eclipse MAT这样的工具来查看到gc根的路径。Eclipse MAT甚至可以为您检查泄漏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接