检查并避免应用程序中的内存泄漏

Sah*_* Mj 12 android memory-leaks android-context

所以,我完成了一个项目,现在我面临的主要问题是应用程序中的内存泄漏("泄漏"意味着您保留对某个活动的引用,从而阻止GC收集它)

我发现的一些发生内存泄漏的案例是:

上下文泄漏

这是因为对活动上下文的长期引用.

我在这里找到的一个很好的例子,

private static Drawable sBackground;

@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);

  TextView label = new TextView(this);
  label.setText("Leaks are bad");

  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);

  setContentView(label);
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是private static Drawable sBackground;静态Drawable是以Activity作为上下文创建的,所以在这种情况下,有一个引用Activity的Drawable的静态引用,这就是泄漏的原因.只要该引用存在,Activity就会保留在内存中,泄露其所有视图.

屏幕方向改变

引起注意的第二种情况是屏幕方向改变时.当屏幕方向改变时,系统默认会破坏当前活动并创建新活动,同时保留其状态.这样,Android将从资源重新加载应用程序的UI.现在假设您编写了一个带有大位图的应用程序,您不希望在每次轮换时加载该位图.

这将导致大量内存泄漏,因为可能需要加载大的位图.

上下文活动

第三种情况,我发现是对活动上下文的引用.它还会导致内存泄漏.

我想知道是否有任何简单的方法可以避免这种内存泄漏的发生.或者是否有工具可以检查并从应用程序中删除这些内存泄漏.

Cal*_*len 10

我知道这是一个老帖子,但最近Square发布了一个名为LeakCanary的库,这是迄今为止找到内存泄漏的最优雅的解决方案.