Java GC项目可以迭代过去吗?

时间:2015-05-26 13:04:29

标签: java garbage-collection jvm

我们说我有以下Java方法:

private static void testLoop() throws Exception {
    List<Integer> list = new ArrayList<>();
    for (int i = 0 ; i < 100000 ; i++)
        list.add(i);
    for (Integer a : list) {
        Thread.sleep(10000); // Simulate lots of work.
    }
}

问题:一旦我在慢速循环中对它们进行迭代,JVM是否能够对我的整数进行垃圾收集(因为我不会将list重用于其他内容) ?

2 个答案:

答案 0 :(得分:5)

不,list引用仍然存在(因此也是对整数对象的引用)。 JVM不会推断列表是中途遍历的,并且不再需要一些Integer对象。

如果您希望对象符合垃圾收集的条件,您必须完全删除列表中的引用,或者通过null替换它们(正如@Brandon在评论中所建议的那样):< / p>

ListIterator<Integer> iter = list.listIterator();
while (iter.hasNext()) {
    int i = itr.next();
    iter.set(null);      // or iter.remove() but that's O(n) instead of O(1)
    // process i
    Thread.sleep(10000); // Simulate lots of work.
}

答案 1 :(得分:1)

一般没有。

但如果你使用这样的东西:

Iterator<Integer> itr = list.iterator();
Integer i;

while (itr.hasNext()) {
    i = itr.next();
    itr.remove();
    Thread.sleep(10000); // Simulate lots of work.
}

为GC提供更多更改以清理使用的整数。