垃圾收集不是从类调用finalize()方法

时间:2014-03-20 22:18:59

标签: java garbage-collection

作为练习,我编写了应该使用垃圾收集器和方法finalize()

从内存中清除对象的程序
class Dog {
    boolean dogAlive = false;
    String dogName;
    Dog(String dogName) {
        this.dogName = dogName;
    }
    void makeDogAlive() {
        dogAlive = true;
    }
    void makeDogDead() {
        dogAlive = false;
    }
    protected void finalize() {
        System.out.println("test");
        if (dogAlive)
            System.out.println("Error: you need to finish life of your dog");
    }
}
public class FinalisationExc1 {
    public static void main(String[] args) {
        Dog dog1 = new Dog("Azor");
        dog1.makeDogAlive();
        System.out.println("Your dog name is " + dog1.dogName);
        System.gc();
    }
}

但看起来System.gc()没有调用我的finalize()方法?我在书中的例子中完成了所有相同的操作(我的意思是在那里使用的方法,但代码是我的),当书中的例子正在工作时,我的不是:(。你能给我任何线索,我犯了错误吗?< / p>

编辑: 好的,我在我的程序上工作了一下,当我创建System.gc()(第一种方法)而不是`Dog dog1 = new Dog(&#)时,我会调用new Dog("Azor")来调用{{1}} 34; Azor&#34;)(第二种方法)。我刚刚开始学习Java,当我看到差异时(在第二种方法中我们创建了对象dog1,但我们是否在第一种方法中创建了什么?)我不明白它。

3 个答案:

答案 0 :(得分:3)

System#gc()不会触发垃圾回收。它建议将垃圾收集到JVM。因此,Object#finalize()无法保证在任何特定时间运行。它由垃圾收集器调用,您的代码不会(也不应该)直接控制它。

答案 1 :(得分:2)

据我所知,调用System.gc并不能保证垃圾收集过程实际运行。根据文件:

  

调用gc方法建议表示Java虚拟机   努力回收未使用的物体,以便制造   他们目前占用的内存可以快速重用。

在你的情况下,很可能你的程序在GC甚至有机会运行之前结束。

答案 2 :(得分:2)

System.gc()没有义务做任何事情。这只是对垃圾收集器的暗示。见Javadoc。此外,您的程序会在您调用它时立即退出,但这并没有给它提供足够的操作空间。