android - 在这种情况下,到底什么是内存泄漏?

标签 android memory-leaks

为了清除所有后台 Activity ,我执行了以下操作:

我保留了一个静态数组列表,每当我从一个 Activity 转到另一个 Activity 时,在新 Activity 的 onCreate() 方法中,我将当前 Activity 的对象添加到该列表中,如下所示:

SomeClass.addActivity(CurrentActivity.this);

我在每个 Activity 中添加了上述语句。

addActivity():

public void addActivity(final Activity activity) {
            activityList.add(activity);
        }

当我想清除堆栈时,我调用了:

public boolean clearStack() {
        for (Activity activity : activityList) {
            activity.finish();
        }
        activityList.clear();
        return (activityList.isEmpty());
    }

这样,我就清除了我的 Activity 堆栈。

但是它产生了内存泄漏。这不是正确的做法。保留对 Activity 的引用是不行的。你们能解释一下这种情况下内存泄漏的原因和具体方式吗?

我使用 MAT for eclipse 在我的应用程序中发现了这个内存泄漏。

任何帮助将不胜感激。

最佳答案

持有对其上下文之外的 Activity 的引用(当它们处于后台或“关闭”/完成时)会导致内存泄漏 - Android 操作系统在决定是时候从内存中清除“旧” Activity 所以(你无法手动控制它)。

在这种情况下 - 垃圾收集器会尝试从内存中释放一个或多个 Activity ,但因为某些东西(对 Activity 的引用数组)持有对它的引用 - 它不能被垃圾收集,所以它可以不将其从内存中释放 - 这是内存泄漏的一个示例。

本文档描述了如何避免内存泄漏:

http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html

关于android - 在这种情况下,到底什么是内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10845400/

相关文章:

java - 我在 android studio 中使用什么来进行多个 Activity ?

android - 在 Android 中选择 EGL 配置的正确方法是什么?

c# - 堆内存问题

delphi - 为什么基于TComponent的接口(interface)实现会泄漏内存?

快速组合接收器接收值内存泄漏

android - 如何在 Android 中为 ViewPager 添加圆点?

Android ViewFlipper 使用来自 URL 的图像更改背景如何

ios - NSOperationQueue 和内存

delphi - 如何获取实例内存泄漏的自定义结构体的名称?

Android 猴子测试选择一个特定的 Activity