【发布时间】:2015-07-20 14:03:31
【问题描述】:
我正在使用LeakCanary 库来监控我的应用程序中的内存泄漏。我收到了这个内存泄漏,但不知道如何找出导致它的原因。
05-09 09:32:14.731 28497-31220/? D/LeakCanary﹕ In com.etiennelawlor.minesweeper:0.0.21:21.
* com.etiennelawlor.minesweeper.fragments.MinesweeperFragment has leaked:
* GC ROOT com.google.android.gms.games.internal.GamesClientImpl$PopupLocationInfoBinderCallbacks.zzahO
* references com.google.android.gms.games.internal.PopupManager$PopupManagerHCMR1.zzajo
* references com.google.android.gms.games.internal.GamesClientImpl.mContext
* references com.etiennelawlor.minesweeper.activities.MinesweeperActivity.mFragments
* references android.app.FragmentManagerImpl.mAdded
* references java.util.ArrayList.array
* references array java.lang.Object[].[0]
* leaks com.etiennelawlor.minesweeper.fragments.MinesweeperFragment instance
* Reference Key: 2f367393-6dfd-4797-8d85-7ac52c431d07
* Device: LGE google Nexus 5 hammerhead
* Android Version: 5.1 API: 22
* Durations: watch=5015ms, gc=141ms, heap dump=1978ms, analysis=23484ms
这是我的仓库:https://github.com/lawloretienne/Minesweeper
这似乎是一个难以捉摸的问题。我设置了一个Interface 来在Fragment 和Activity 之间进行通信。我在onAttach() 中设置了这个mCoordinator Interface 变量,然后我意识到我没有在onDetach() 中将其归零。我解决了这个问题,但仍然出现内存泄漏。有什么想法吗?
更新
我禁用了Fragment 泄漏监视,但我仍然收到有关活动泄漏的通知,其中包含以下泄漏跟踪:
05-09 17:07:33.074 12934-14824/? D/LeakCanary﹕ In com.etiennelawlor.minesweeper:0.0.21:21.
* com.etiennelawlor.minesweeper.activities.MinesweeperActivity has leaked:
* GC ROOT com.google.android.gms.games.internal.GamesClientImpl$PopupLocationInfoBinderCallbacks.zzahO
* references com.google.android.gms.games.internal.PopupManager$PopupManagerHCMR1.zzajo
* references com.google.android.gms.games.internal.GamesClientImpl.mContext
* leaks com.etiennelawlor.minesweeper.activities.MinesweeperActivity instance
* Reference Key: f4d06830-0e16-43a2-9750-7e2cb77ae24d
* Device: LGE google Nexus 5 hammerhead
* Android Version: 5.1 API: 22
* Durations: watch=5016ms, gc=164ms, heap dump=3430ms, analysis=39535ms
【问题讨论】:
-
我很想知道是否只有片段泄漏,或者活动是否也泄漏。如果您禁用片段泄漏监视,您是否仍会收到有关活动泄漏的通知?
-
但是您是否手动尝试过使用 mat 或任何其他工具?
-
@Elltz 我没有尝试过 mat 或任何其他工具。
-
看来您需要调用 GoogleApiClient .unregisterConnectionCallbacks 和 GoogleApiClient .unregisterConnectionFailedListener 方法,因为使用 GoogleApiClient.Builder 添加监听器。 developer.android.com/reference/com/google/android/gms/common/…
-
考虑添加日志以查看您的
onDestroy()方法是否被调用。如果不是,正如 Dmide 下面建议的那样,您应该将您的取消注册呼叫放入onStop()或onPause()
标签: android memory-leaks leakcanary