Java GC 项可以迭代过去吗?
Can Java GC items iterated past?
假设我有以下 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
其他)?
不,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.
}
一般没有
但是如果你使用这样的东西:
Iterator<Integer> itr = list.iterator();
Integer i;
while (itr.hasNext()) {
i = itr.next();
itr.remove();
Thread.sleep(10000); // Simulate lots of work.
}
为 GC 提供更多更改以清理已使用的整数。
假设我有以下 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
其他)?
不,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.
}
一般没有
但是如果你使用这样的东西:
Iterator<Integer> itr = list.iterator();
Integer i;
while (itr.hasNext()) {
i = itr.next();
itr.remove();
Thread.sleep(10000); // Simulate lots of work.
}
为 GC 提供更多更改以清理已使用的整数。