垃圾回收未从类 [closed] 调用 finalize() 方法

Garbage collection is not calling finalize() method from class [closed]

提问人:blekione 提问时间:3/21/2014 最后编辑:blekione 更新时间:3/21/2014 访问量:507

问:


这个问题似乎不是关于帮助中心定义的范围内的编程。

9年前关闭。

作为练习,我编写了程序,该程序应该使用垃圾回收器和方法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()

编辑: 好的,我在我的程序上做了一些工作,当我创建对象(我吗?)时,它看起来像是用(第一种方法)而不是'Dog dog1 = new Dog(“Azor”)(第二种方法)调用的。我刚刚开始学习 Java,当我看到差异时(在第二种方法中,我们创建对象 dog1,但我们在第一种方法中创建任何东西吗?我不明白。System.gc()new Dog("Azor")

Java 垃圾回收

评论

0赞 arshajii 3/21/2014
Java Finalize 方法调用的可能重复项
0赞 user207421 3/21/2014
@arshajii 当然不是。
1赞 Jason C 3/21/2014
快速阅读(实际上是 Runtime.gc() 和相关方法的文档将得出这个问题的答案。此外,Object.finalize() 的文档描述了正在发生的事情,以及 stackoverflow.com/questions/2506488/java-finalize-method-call(这很可能是重复的)。SO 不能替代 Google 和文档。System.gc()Runtime
3赞 Jason C 3/21/2014
这个问题似乎偏离了主题,因为在询问有关方法行为的问题之前应该阅读文档,而 SO 不能替代 Google 或 JDK 文档。
1赞 user207421 3/21/2014
@arshajii 请详细说明为什么关于 System.gc() 不调用 finalize() 的问题与关于 finalize() 的问题根本不被调用的问题重复。

答:

3赞 Matt Ball 3/21/2014 #1

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

评论

2赞 Boris the Spider 3/21/2014
我不相信保证会跑......finalize
0赞 Matt Ball 3/21/2014
@BoristheSpider保证在 GC 期间调用它:“当垃圾回收确定不再有对该对象的引用时,由垃圾回收器对对象调用。当然,不能保证GC何时发生。
2赞 Edwin Dalorzo 3/21/2014 #2

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

调用 gc 方法建议 Java 虚拟机 努力回收未使用的物品,以使 它们当前占用的内存可用于快速重用。

在您的情况下,您的程序很可能在 GC 有机会运行之前就结束了。

2赞 user207421 3/21/2014 #3

System.gc() 没有义务做任何事情。这只是对垃圾收集器的提示。请参阅 Javadoc。此外,您的程序会在您调用它后立即退出,这不会给它太多的行动空间。