2017-12-18 258 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