作为练习,我编写了应该使用垃圾收集器和方法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,但我们是否在第一种方法中创建了什么?)我不明白它。
答案 0 :(得分:3)
System#gc()
不会触发垃圾回收。它建议将垃圾收集到JVM。因此,Object#finalize()
无法保证在任何特定时间运行。它由垃圾收集器调用,您的代码不会(也不应该)直接控制它。
答案 1 :(得分:2)
据我所知,调用System.gc
并不能保证垃圾收集过程实际运行。根据文件:
调用gc方法建议表示Java虚拟机 努力回收未使用的物体,以便制造 他们目前占用的内存可以快速重用。
在你的情况下,很可能你的程序在GC甚至有机会运行之前结束。
答案 2 :(得分:2)
System.gc()没有义务做任何事情。这只是对垃圾收集器的暗示。见Javadoc。此外,您的程序会在您调用它时立即退出,但这并没有给它提供足够的操作空间。