我试图查看垃圾收集器“垃圾收集”对象的时间。根据文档,当垃圾收集器“删除”一个对象时,会调用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
答案 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()
,但它可能会收集对象。