我正在做一个有关Java及其容量允许内存泄漏的实验。我写了这个简单的代码:Java:内存泄漏奇怪与列表
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
class Obj {
int i;
Obj(int i) {
this.i = i;
}
}
List<Obj> list;
while(true) {
list = new ArrayList<Obj>();
for(int i = 0; i < 1000; i++) {
Obj o = new Obj(i);
list.add(o);
}
try {
Thread.sleep(1); //<-- added to give the gc time to trash the previous iteration
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
当这被执行(尤其是更多的对象被添加到列表中每个迭代),您可以快速观看使用的内存的增加量。我能够在每次迭代中添加10000个对象的情况下非常快速地达到2 GB。它看起来好像列表(以及利用“链接列表”列表的其他类型的对象,如函数)不喜欢被删除。
当我没有将对象添加到列表中时,内存堆根本没有增加(意味着垃圾处理正在完成它的工作)。我试着将列表重置为空,然后重新声明以及调用clear()方法。似乎没有任何工作。每当我在一个循环中使用List,我的RAM就会呼救。
那么,为什么会发生这种情况呢?为什么垃圾处理不是每次迭代都要摆脱清单,而不是让它们叠加起来?列表界面是否不允许这种用法?我只是没有给予垃圾处理足够的时间摆脱最后的情况?
注意:'Thread.sleep(1)'睡眠1毫秒,而不是1秒。 – 2013-03-12 19:39:24
是的,我知道。我也尝试过更长的持续时间。 – CoderTheTyler 2013-03-12 19:39:48
使用'System.gc()'运行垃圾回收。睡眠不会有伎俩。而且,'list'仍然是从当前函数框架引用的,所以它可能不会被收集。 – kan 2013-03-12 19:40:52