有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在使用arraylist for each时如何避免内存泄漏?

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


共 (2) 个答案

  1. # 1 楼答案

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

    答案是“不,不对”

    但我知道这会发生在你的代码中。对于每个循环,基本上有三种情况(需要避免)会导致内存泄漏:

    1. 使用for each循环而不是simple for循环
    2. for each循环嵌套在无限循环中(例如while(true){...}
    3. for each循环是在集合(例如,ArrayList)而不是数组上循环

    在这些情况下会引发内存泄漏,因为在运行内部类hasNext()next()或其他方法Itr之前,将执行以下代码片段(您可以在ArrayList类中进行检查)

    @NotNull public Iterator<E> iterator() {
        return new Itr();
    }
    

    由于这个代码段是在无限循环中被调用的,因此Itr的无限实例将被创建,并最终导致内存泄漏

  2. # 2 楼答案

    重写活动的onDestroy方法,并显式地将stopped设置为true,以便在活动关闭时退出while循环,ArrayList将可用于垃圾收集