【问题标题】:What's exactly a memory leak in this case?在这种情况下,究竟什么是内存泄漏?
【发布时间】:2012-06-01 06:25:26
【问题描述】:

为了清除所有后台活动,我做了以下操作:

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

SomeClass.addActivity(CurrentActivity.this);

我在每个活动中都添加了上述语句。

addActivity():

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

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

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

这样,我清除了我的活动堆栈。

但它产生了内存泄漏。这不是正确的做法。持有对活动的引用是不行的。你们能解释一下在这种情况下发生内存泄漏的原因和方式吗?

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

任何帮助将不胜感激。

【问题讨论】:

    标签: android memory-leaks


    【解决方案1】:

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

    在这种情况下 - 垃圾收集器会尝试从内存中释放活动/活动,但是因为某些东西(您对活动的引用数组)持有对它的引用 - 它不能被垃圾收集,所以它可以'不要从内存中释放它——这就是内存泄漏的一个例子。

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

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

    【讨论】:

    • @Shrikant:如果您愿意,我可以为您提供更好的解决方案来清除后台活动
    • stackoverflow.com/questions/10736594/… 阅读此内容,以及某人在回答我的问题时发布的链接
    • 解决方案是发送广播,所有注册到的活动将在接收时自行完成
    【解决方案2】:

    尝试旋转设备几次,看看会发生什么 - 你最终会耗尽内存,因为你仍然持有对 GC 无法清除的先前上下文的引用。

    【讨论】:

    • 是的,我知道,这就是我问这个问题的原因。
    猜你喜欢
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2011-09-22
    • 2013-11-15
    相关资源
    最近更新 更多