【问题标题】:android.widget.LinearLayout instance leakingandroid.widget.LinearLayout 实例泄漏
【发布时间】:2020-01-23 14:23:45
【问题描述】:

我有两个活动,QuestionnaireSelectionActivity 和 QuestionnaireMainActivity。 QuestionnaireMainActivity 由 QuestionnaireSelectionActivity 启动。 QuestionnaireMainActivity 显示一系列片段。

当我尝试通过按返回按钮从 QuestionnaireMainActivity 返回 QuestionnaireSelectionActivity 时,LeakCanary 报告泄漏。

这两个活动都没有以任何方式(除了意图)引用另一个。当片段被销毁并且没有内部类时,我将对视图等的所有引用设置为 null。

QuestionnaireSelectionActivity 确实有一个 LinearLayout,但我不明白它是如何参与这个问题的。我没有在我的代码中引用任何 LinearLayout。

谁能帮助我了解我的活动是如何泄露的?

以下是 LeakCanary 的报告:

│ GC Root: System class
│
├─ android.view.WindowManagerGlobal class
│    Leaking: NO (a class is never leaking)
│    ↓ static WindowManagerGlobal.sDefaultWindowManager
│                                 ~~~~~~~~~~~~~~~~~~~~~
├─ android.view.WindowManagerGlobal instance
│    Leaking: UNKNOWN
│    ↓ WindowManagerGlobal.mViews
│                          ~~~~~~
├─ java.util.ArrayList instance
│    Leaking: UNKNOWN
│    ↓ ArrayList.elementData
│                ~~~~~~~~~~~
├─ java.lang.Object[] array
│    Leaking: UNKNOWN
│    ↓ Object[].[2]
│               ~~~
├─ android.widget.LinearLayout instance
│    Leaking: YES (View.mContext references a destroyed activity)
│    mContext instance of com.android.neptune.QuestionnaireMainActivity with mDestroyed = true
│    View#mParent is set
│    View#mAttachInfo is not null (view attached)
│    View.mWindowAttachCount = 1
│    ↓ LinearLayout.mContext
╰→ com.android.nq.QuestionnaireMainActivity instance
​     Leaking: YES (ObjectWatcher was watching this because com.android.nq.QuestionnaireMainActivity received Activity#onDestroy() callback and Activity#mDestroyed is true)
​     key = c4204b14-4279-44d3-ba57-83e5cb26a1ef
​     watchDurationMillis = 5185
​     retainedDurationMillis = 183

【问题讨论】:

    标签: android android-activity memory-leaks leakcanary


    【解决方案1】:

    此泄漏看起来与此处确定的泄漏相似:https://github.com/square/leakcanary/blob/1f6c971caba4d5cf78ac561b0cec006a2c482a1b/shark-android/src/main/java/shark/AndroidReferenceMatchers.kt#L673

    在 Activity 被销毁后,Android WindowManagerGlobal 单例似乎保留了对您的 LinearLayout 实例的引用,但目前尚不清楚原因。

    这很可能不是您的应用程序中的错误,尽管它可能是由您的应用程序特定的行为触发的。

    你能在 LeakCanary 中创建一个新问题吗? https://github.com/square/leakcanary/issues 如果您提供您看到此问题的 Android 版本以及 hprof 文件(这很有帮助),那么我们可以调查并确定 Android 框架中的确切问题。

    【讨论】:

    • 嗨,我也遇到过这种情况,不同的是它发生在屏幕旋转期间。这是误报吗?
    猜你喜欢
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多