什么时候会在这个Java代码中发生垃圾收集?

时间:2014-03-28 18:58:15

标签: java garbage-collection

在我的示例代码中,哪些Test对象在执行结束时有资格进行垃圾回收?

interface Animal1
{
    void makeNoise();
}


class Horse implements Animal1
{
    Long weight = 1200L;

    @Override
    public void  makeNoise()
    {
        System.out.println("Whinny");
    }
}

public class Test extends Horse
{
    public void makeNoise()
    {
        System.out.println("wginny");
    }

    public static void main(String str[])
    {
        Test t1 = new Test();
        Test t2 = new Test();
        Test t3 = new Test();
        t3 = t1;
        t1 = t2;
        t2 = null;
        t3 = t1;
    }
}

2 个答案:

答案 0 :(得分:1)

    Test t1=new Test();
    Test t2=new Test();
    Test t3=new Test();
    t3=t1; 
    t1=t2;
    t2=null;
    t3=t1;

答案是t3和t1。 t2仍然有一个存储在t1中的引用,然后存储到t3中。为t1和t3创建的原始对象有资格进行垃圾回收,因为它们不再具有强引用,因为不同的值保存在它们中。一个很好的心理锻炼,但这可能是你刚才复制粘贴的作业。

一旦对其封闭物体的强烈引用消失,那些长号都有资格进行垃圾收集。

或者,如果您的应用程序退出,则所有对象都有资格进行垃圾回收。

答案 1 :(得分:0)

不确定这是否是您要求的,但我算是6。

1: Test t1 original value
2: Test t2 original value
3: Test t3 original value
4: Long t1.weight (autoboxed. not flyweighted because of the high value)
5: Long t2.weight (autoboxed. not flyweighted because of the high value)
6: Long t3.weight (autoboxed. not flyweighted because of the high value)

请注意,所有调用的方法只会分配1个飞加的字符串。字符串是不可改变的& Java会分享这些引用。