【问题标题】:Understanding Memory leaks for Context and ContextWrapper了解 Context 和 ContextWrapper 的内存泄漏
【发布时间】:2018-07-23 11:17:57
【问题描述】:

我有一个类,它有一个包含Context 引用的静态变量。

public static Context context;

Android Studio 发出警告说 静态引用 上下文类导致内存泄漏

如果我删除 static 关键字,它不会给出任何警告。

ContextWrapper 类的类似场景也是如此。

我的理解是,如果我们持有与Context 相关的类的引用会导致内存泄漏。但是,为什么 Android Studio 对非静态 Context 引用没有任何警告?

我看过一些代码示例,它们扩展了ContextWrapper 类。每当他们需要Context 时,他们都会通过扩展“ContextWrapper”的类进行访问。 这种方法不会导致内存泄漏吗?

另外,运行时非静态Context 引用会发生内存泄漏吗?我理解错了吗?我在这里遗漏了什么吗?

谁能解释一下?

提前致谢。

【问题讨论】:

标签: android memory-leaks


【解决方案1】:

首先,让我们了解内存泄漏以及它发生的确切原因

如果内存中的任何数据无法被垃圾收集,则会发生内存泄漏,话虽如此,static 变量不能被垃圾收集,因为它们在整个应用程序生命周期中都存在于内存中,而 non-static一旦不再引用它的封闭父级,变量就可以被垃圾收集,请记住这一点,我们将看到示例来解释您的问题。

考虑具有静态和非静态变量的 A 类

Class A{
   private static Context iCanNeverBeDestroyed; 
     // Scope -> Application life, so memory leak can occur
   private Context iCanBeDestroyedWithA;  
      // Scope -> A
   private static int itWontMatterWhetherImDestroyedOrNot; 
     //Even though the scope is Application, due to low memory usage , memory leak is negligible in this case
}

泄漏是根据变量的范围和内存中的大小一起计算的,内存越大,范围越大泄漏的机会越大,例如Context,Bitmap等

【讨论】:

  • 你的意思是如果类A一直存在到应用程序销毁,那么这会导致内存泄漏?
  • 这样不行,正在使用的内存显然不会被垃圾回收,也不会被视为内存泄漏,如果您在整个应用程序中仅使用A,则不会是泄漏,如果您切换到 B 并且 A 没有被收集,那么它将是内存泄漏。
最近更新 更多