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

时间:2012-12-04 05:26:16

标签: android memory-leaks android-context

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

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

上下文泄漏

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

我发现了一个非常好的例子here

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);
}

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

屏幕方向更改

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

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

上下文活性

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

我想知道是否有任何简单的方法可以避免此类内存泄漏 发生。或者是否有可以检查和删除它们的工具 应用程序的内存泄漏。

2 个答案:

答案 0 :(得分:10)

答案 1 :(得分:10)

我知道这是一篇旧帖子,但最近Square发布了一个名为LeakCanary的库,它是找到内存泄漏的最优雅的解决方案。