下面的代码中是否有垃圾收集?
public static void main(String []args){
System.out.println("Hello World");
Vector v1 = new Vector();
Vector v2 = new Vector();
v1 = null;
Vector v3 = v1;
v1 = v2;
v1.addElement(v2);
}
我回答为是,因为对象v3
不再在代码中被访问。
答案 0 :(得分:2)
在代码v1 = null
之后,变量v1
之前引用的对象是垃圾回收的候选对象。
此外,在main结束之前不会抛出Exception
,因此可能会发生垃圾收集。
请注意不确定是否调用了垃圾收集,可能不是因为代码很快就会完成而不需要进行垃圾回收。
这是一个逐行解释的代码。
Vector v1 = new Vector(); // Creates a new Vector (I call it vFirst) and assign it to v1
Vector v2 = new Vector(); // Creates a new Vector (I call it vSecond) and assign it to v2
v1 = null; // Now vFirst is not referenced by any variable so is candidate to be gc
Vector v3 = v1; // Assign a null value to v3
v1 = v2; // Assign to v1 the vector vSecond
v1.addElement(v2); // Add to the vSecond the element vSecond
正如您在v1 = null后看到的那样,创建的第一个Vector可以被垃圾收集。它并不意味着垃圾收集,但如果GC需要内存,它可以被垃圾收集。
答案 1 :(得分:1)
引用v1
设置为null
,因此垃圾收集器将收集此引用引用的对象。但是,您无法控制集合本身,您可能会要求JVM启动它,但它可能会被拒绝。这完全取决于运行时堆内存的要求。
答案 2 :(得分:1)
分配{{1}}后,分配给v1的原始Vector不再可访问,并且将被垃圾回收。 v3开头为null,不会被GCed
答案 3 :(得分:1)
将任何对象指定为null后,该对象才有资格进行垃圾回收。它并不一定意味着它会在那个时间点被垃圾收集。
因此,当v3变为null时,它肯定符合gc的条件,但是在什么时候收集垃圾是不确定的。
答案 4 :(得分:0)
否。 v3只是GC的候选者。 这里没有明确的GC语句,它不能是=)