下面的代码中是否有垃圾收集?

时间:2016-01-31 18:34:12

标签: java garbage-collection

下面的代码中是否有垃圾收集?

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不再在代码中被访问。

5 个答案:

答案 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语句,它不能是=)