每个使用arraylist时如何避免内存泄漏?

时间:2017-10-24 02:34:03

标签: java android arraylist memory-leaks

private ArrayList<OutputInputPair> pairs = new ArrayList<OutputInputPair>();
public void process() {
    while (!stopped) {
        for (OutputInputPair pair : pairs) {
            processCommandPairs(pair);
        }
    }
}

首先当用户点击停止按钮stopped = true时,如果用户没有点击按钮, 始终执行processCommandPairs方法。

停止按钮时单击

@Override
public void stop() {
    Log.d(TAG, "STOP memory leak");
    pairs.clear();
    pairs = null;
    stopped = true;
}

我只有一个问题,如果用户没有点击按钮,阵列列表中发生内存泄漏是对的吗?

如果没有,如何避免arraylist上的内存泄漏?

感谢。 enter image description here

3 个答案:

答案 0 :(得分:1)

重写活动的onDestroy方法并明确将stopped设置为true,以便在活动关闭且ArrayList可用于垃圾回收时退出while循环。

答案 1 :(得分:0)

在Android中使用WeakReference与使用普通旧Java中的WeakReference没什么不同。这是一个很好的指南,它给出了详细的解释:https://community.oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references

每当需要对对象的引用时,您应该考虑使用它,但是您不希望该引用保护对象免受垃圾收集器的影响。一个典型的例子是当内存使用率过高时你希望被垃圾收集的缓存(通常用WeakHashMap实现)。

答案 2 :(得分:0)

关于您的问题: “我只有一​​个问题,如果用户不单击按钮,发生数组列表中的内存泄漏是正确的吗?”

答案是“不。这不对”

但是我知道它确实会在您的代码中发生。导致内存泄漏以及for-each循环,基本上有3种情况组合在一起(需要避免):

  1. 使用for-each循环代替简单的for-loop
  2. for-each循环嵌套在无限循环内(例如while(true){...}
  3. for-each循环正在遍历集合(例如 ArrayList )而不是数组

在这种情况下会引发内存泄漏,因为在运行内部类{内的hasNext()next()或其他方法之前,将执行下面的代码段(可以在ArrayList类中检查): {1}}

Itr

由于此代码段是在无限循环内调用的,因此将创建@NotNull public Iterator<E> iterator() { return new Itr(); } 的无限实例,并最终导致内存泄漏。