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

Zty*_*tyx 2 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.
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:一旦我在慢速循环中迭代它们,JVM是否能够垃圾收集我的整数(因为我不会重复使用list其他东西)?

aio*_*obe 5

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

如果您希望对象符合垃圾回收的条件,则必须完全删除列表中的引用,或者通过替换它们null(如@Brandon在注释中所建议的那样):

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.
}
Run Code Online (Sandbox Code Playgroud)

  • @TheLostMind,布兰登仍然有一个好点.`ArrayList`上的`remove`是O(n).调用`set`是O(1). (2认同)