Java 使用arraylist for each时如何避免内存泄漏?
我只有一个问题,若用户不点击按钮,数组列表中发生内存泄漏是对的 如果没有,如何避免arraylist上的内存泄漏 谢谢。Java 使用arraylist for each时如何避免内存泄漏?,java,android,arraylist,memory-leaks,Java,Android,Arraylist,Memory Leaks,我只有一个问题,若用户不点击按钮,数组列表中发生内存泄漏是对的 如果没有,如何避免arraylist上的内存泄漏 谢谢。 覆盖活动的onDestroy方法,并显式将stopped设置为true,这样当活动关闭时while循环退出,ArrayList将可用于垃圾收集。在Android中使用WeakReference与在普通的旧Java中使用WeakReference没有任何不同。下面是一个很好的指南,它给出了详细的解释: 每当需要对对象的引用时,您应该考虑使用一个引用,但您不希望该引用保护对象不受
覆盖活动的
onDestroy
方法,并显式将stopped
设置为true,这样当活动关闭时while循环退出,ArrayList将可用于垃圾收集。在Android中使用WeakReference与在普通的旧Java中使用WeakReference没有任何不同。下面是一个很好的指南,它给出了详细的解释:
每当需要对对象的引用时,您应该考虑使用一个引用,但您不希望该引用保护对象不受垃圾收集器的影响。一个典型的例子是当内存使用率过高时(通常使用WeakHashMap实现)希望对其进行垃圾收集的缓存。关于您的问题:
“我只有一个问题,若用户不点击按钮,数组列表中发生内存泄漏是否正确?”
答案是“不,不对”
但我知道这会发生在你的代码中。对于每个循环,导致内存泄漏的情况基本上有3种(需要避免):
while(true){…}
)Itr
中的hasNext()
、next()
或其他方法之前,将执行以下代码片段(您可以在ArrayList类中进行检查)
@Override
public void stop() {
Log.d(TAG, "STOP memory leak");
pairs.clear();
pairs = null;
stopped = true;
}
@NotNull公共迭代器迭代器(){
返回新的Itr();
}
由于此代码段是在无限循环中调用的,因此将创建
Itr
的无限实例,并最终导致内存泄漏。我不能100%确定您在做什么,但您似乎正在与事件驱动编程范式作斗争。@HovercraftFullOfEelsprocess()
方法仅执行,记录开始。当我停止按钮单击时,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();
}