13

所以,我完成了一个项目,现在我面临的主要问题是应用程序中的内存泄漏(“泄漏”意味着您保留对活动的引用,从而阻止 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);
}

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

屏幕方向更改

引起注意的第二种情况是屏幕方向发生变化时。默认情况下,当屏幕方向发生变化时,系统将销毁当前活动并创建一个新活动,同时保留其状态。这样做时,Android 将从资源中重新加载应用程序的 UI。现在想象一下,您编写了一个带有大位图的应用程序,您不想在每次旋转时都加载该位图。

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

上下文活动

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

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

4

2 回答 2

11

我知道这是一篇旧文章,但最近 Square 发布了一个名为LeakCanary的库,它是迄今为止寻找内存泄漏的最优雅的解决方案。

于 2015-08-20T17:23:50.103 回答