为什么这里不调用finalize()。代码成功编译并运行,但没有任何输出。
package temp;
public class Temp {
int i;
Temp(int j) {
i = j;
}
public void finalize() {
if (i == 10) {
System.out.println("Finalize called.");
}
}
public static void main(String[] args) {
Temp obj = new Temp(10);
System.gc();
}
}发布于 2014-12-16 14:53:17
您对System.gc();的调用没有任何区别,因为您的Temp实例有一个引用(obj),所以它不适合进行垃圾收集。
即使它符合垃圾收集的条件,调用System.gc();也不一定会立即收集所有没有引用这些对象的对象。
发布于 2014-12-16 14:55:37
碰巧我正在读Effective Java。
第7项:避免FINALIZERS
终结器是不可预测的,通常是危险的,而且通常是不必要的。-Effective Java (第50页)
另一个来自pdf。
不要被System.gc和System.runFinalization方法所诱惑。他们可能会增加终结器被执行的几率,但他们不能保证这一点。唯一声称能保证完成的方法是System.runFi- nalizersOnExit及其邪恶的孪生兄弟Runtime.runFinalizersOnExit。这些方法存在致命缺陷,已被ThreadStop弃用。
基于这一点,使用System.gc只会增加终结器被执行的几率,更重要的是,使用它并不能保证它会运行垃圾收集,它只是向建议。
再来一次。
语言规范不仅不能保证终结器会迅速执行,也不能保证终结器会在第二章中执行,创建和销毁对象28。完全有可能,甚至很有可能,程序在不对某些不再可访问的
对象执行终结器的情况下终止
发布于 2014-12-16 14:55:29
添加obj = null;以使引用为空,然后将调用finalize方法。这也不是一个有保证的行为,对我来说,有1-2次我能够在5次中叫到它。
public static void main(String[] args) {
Temp obj = new Temp(10);
obj = null;
System.gc();
}输出
hi10
Finalize called.https://stackoverflow.com/questions/27499077
复制相似问题