我们说我有以下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
重用于其他内容) ?
答案 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提供更多更改以清理使用的整数。