代码之家  ›  专栏  ›  技术社区  ›  Mathias Conradt

com.android.internal.policy.impl.phoneLayoutFlater有时仍保留在内存中(hprof dumps)

  •  8
  • Mathias Conradt  · 技术社区  · 16 年前

    我正在检查内存,试图通过hprof转储找到最终的内存泄漏。

    我发现有时当我通过back按钮离开一个活动(它将完成该活动)时,该活动仍会保留在内存中,但它只有两个GC根,虽然看起来不是很“强”。

    这是我的活动流程/我单击并测试的方式:

    A、 B,C是活动。

    1) A->B->(返回)A

    结果如下:

    B还在记忆中 ,B活动的GC根中的唯一元素是:

    com.myapp.android.activity.directory.B目录

    • com.android.internal.policy.impl.phoneLayoutFlater手机

      • android.app.ContextImpl[Stack Local]的mlayoutingflater

        • java.lang.Thread[Thread]“main”的[local variable]
    • 磨坊 android.app.ContextImpl的[Stack Local]

    (线程“main”似乎是UI线程)

    从A继续:

    4) 进行hprof转储 结果如下(如预期):

    B已经不在记忆中了 ,C已经不在记忆中了,只有A

    这个phoneLayoutFlater是从哪里来的/当我从B返回到A时,为什么它会留在内存中,但在进一步转到C并返回到A之后它就会消失。

    显然,phoneLayoutFlater是用来放大视图的,我知道它的目的。我只是不明白为什么它会通过主UI线程的GC根保存在内存中。

    当我检查上面列出的GC根时

    java.lang.Thread的[局部变量] [线程]“主

    它将包含以下内容:

    • 一个 [堆栈本地]
      • ....
        • [JNI全球]

    我把A中的活动B和C称为 startActivity(intent)

    为什么活动A的主UI线程会以某种方式与活动B相关和引用?

    2 回复  |  直到 16 年前
        1
  •  0
  •   Tyler Zale    15 年前

    这是我最后做的,但我仍然不高兴我用反射来解决这个问题。有人吗??

    public static boolean ReleaseActivityContext(Context context)
    {                       
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);     
        Class<?> i = inflater.getClass();
    
        try 
        {    
            Field f = i.getSuperclass().getDeclaredField("mContext");
            f.setAccessible(true); // prevent IllegalAccessException
            f.set(inflater, null); // can cause IllegalAccessException
            return true;    
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }   
        return false;   
    }
    
        2
  •  0
  •   AZ_    15 年前

    不要保留对 上下文活动(对 活动应该有同样的生活 循环作为活动本身)

    尝试使用上下文应用程序 而不是上下文活动。

    避免在 生命周期,使用静态内部类 并对 内部活动。

    enter image description here

    然后单击。。。 enter image description here

    你可以看到物体留在记忆中的原因 enter image description here