提问人:blekione 提问时间:3/21/2014 最后编辑:blekione 更新时间:3/21/2014 访问量:507
垃圾回收未从类 [closed] 调用 finalize() 方法
Garbage collection is not calling finalize() method from class [closed]
问:
作为练习,我编写了程序,该程序应该使用垃圾回收器和方法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")
答:
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。此外,您的程序会在您调用它后立即退出,这不会给它太多的行动空间。
评论
Runtime.gc()
和相关方法的文档将得出这个问题的答案。此外,Object.finalize()
的文档描述了正在发生的事情,以及 stackoverflow.com/questions/2506488/java-finalize-method-call(这很可能是重复的)。SO 不能替代 Google 和文档。System.gc()
Runtime