看着垃圾收集器bin一个对象

时间:2011-12-27 13:11:45

标签: java multithreading garbage-collection scjp

我试图查看垃圾收集器“垃圾收集”对象的时间。根据文档,当垃圾收集器“删除”一个对象时,会调用finalize()方法一次。

我试图覆盖finalize()以查看我是否可以看到在我取消对象之后它被调用的位置,但我似乎在无休止地等待。这有用吗?

class Dog{
    ZiggyTest2 z;
    public Dog(ZiggyTest2 z){
        this.z = z;
    }

    protected void finalize() throws Throwable {
        try {
            synchronized(z){
                System.out.println("Garbage collected");
                z.notify();
            }
        } finally {
            super.finalize();
        }
    }
}

主要课程:

class ZiggyTest2{

    public static void main(String[] args){

    ZiggyTest2 z = new ZiggyTest2();        
    Dog dog = new Dog(z);   

        synchronized(z){
            try{
                dog = null;
                z.wait();
            }catch(InterruptedException ie){
                System.out.println("Interrupted");
            }           
        }
    }   
}

我想要做的是看到在我对Dog对象无效后调用finalize()方法。这就是我将notify()语句放在finalize()方法中的原因。这不是因为它只是在等待......

修改

谢谢你们。在我修改ZiggyTest2以添加System.gc();

后,我开始工作了
class ZiggyTest2{

    public static void main(String[] args){

    ZiggyTest2 z = new ZiggyTest2();        
    Dog dog = new Dog(z);   

        synchronized(z){
            try{
                dog = null;
                System.gc();
                z.wait();
            }catch(InterruptedException ie){
                System.out.println("Interrupted");
            }           
        }
    }   
}

输出:

C:\>java ZiggyTest2
Garbage collected

3 个答案:

答案 0 :(得分:2)

设置dog = null后尝试添加System.gc()

答案 1 :(得分:2)

垃圾收集器仅在需要时运行。如果您的程序不需要执行GC,它可以在没有一个的情况下全天运行。您可以调用System.gc()来尝试触发GC。

注意:如果你有一个finalize方法,gc不会等待在后台线程中调用finalize方法,所以该对象可能存在,直到GC AFTER finalize被调用为止。

答案 2 :(得分:1)

嗯,首先,不能保证垃圾收集器何时运行以及将收集什么。很可能收藏家不会在你的例子中运行,因为剩下大量的可用内存。您可以使用System.gc(),但不能保证这实际上会触发收集器,它只是您希望它运行垃圾收集器的JVM的提示。

此外,finalize()每个实例只运行一次,即当finalize()阻止收集对象时,任何进一步的垃圾收集运行都不会再次调用finalize(),但它可能会收集对象。