Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用arraylist for each时如何避免内存泄漏?_Java_Android_Arraylist_Memory Leaks - Fatal编程技术网

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

Java 使用arraylist for each时如何避免内存泄漏?,java,android,arraylist,memory-leaks,Java,Android,Arraylist,Memory Leaks,我只有一个问题,若用户不点击按钮,数组列表中发生内存泄漏是对的 如果没有,如何避免arraylist上的内存泄漏 谢谢。 覆盖活动的onDestroy方法,并显式将stopped设置为true,这样当活动关闭时while循环退出,ArrayList将可用于垃圾收集。在Android中使用WeakReference与在普通的旧Java中使用WeakReference没有任何不同。下面是一个很好的指南,它给出了详细的解释: 每当需要对对象的引用时,您应该考虑使用一个引用,但您不希望该引用保护对象不受

我只有一个问题,若用户不点击按钮,数组列表中发生内存泄漏是对的

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

谢谢。

覆盖活动的
onDestroy
方法,并显式将
stopped
设置为true,这样当活动关闭时while循环退出,ArrayList将可用于垃圾收集。

在Android中使用WeakReference与在普通的旧Java中使用WeakReference没有任何不同。下面是一个很好的指南,它给出了详细的解释:

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

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

答案是“不,不对”

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

  • 使用for each循环而不是simple for循环
  • for each循环嵌套在无限循环中(例如,
    while(true){…}
  • for-each循环在集合(例如ArrayList)而不是数组上循环
  • 在这些情况下会引发内存泄漏,因为在运行内部类
    Itr
    中的
    hasNext()
    next()
    或其他方法之前,将执行以下代码片段(您可以在ArrayList类中进行检查)

    @Override
    public void stop() {
        Log.d(TAG, "STOP memory leak");
        pairs.clear();
        pairs = null;
        stopped = true;
    }
    
    @NotNull公共迭代器迭代器(){
    返回新的Itr();
    }
    

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

    我不能100%确定您在做什么,但您似乎正在与事件驱动编程范式作斗争。@HovercraftFullOfEels
    process()
    方法仅执行,记录开始。当我停止按钮单击时,arraylist部分不会发生内存泄漏谢谢,然后,如果我的活动未关闭,则发生内存泄漏是正确的?如果它存储在RAM中,即使您不再需要它,您也可以告诉它内存泄漏。因此,当您不再需要它时,可以将stopped设置为true,并且不会发生内存泄漏。
    @Override
    public void stop() {
        Log.d(TAG, "STOP memory leak");
        pairs.clear();
        pairs = null;
        stopped = true;
    }
    
    @NotNull public Iterator<E> iterator() {
        return new Itr();
    }