我有以下一段代码。
class SuperClass
{
public void finalize() throws Throwable
{
System.out.println("finalize() in SuperClass...");
}
}
public class FinalizableObject extends SuperClass
{
public static void main(String[] args) throws Exception
{
FinalizableObject obj = new FinalizableObject();
Thread.sleep(1000);
obj = null;
System.gc();
}
public void finalize() throws Throwable
{
super.finalize();
System.out.println("finalize() in FinalizableObject...");
}
}
我获得了所有4种可能的输出
1. finalize not called for sub/super class.
2. finalize called for only sub class.
3. finalize called for only super class.
4. finalize called for both super and sub class.
...在程序的不同运行中。为什么会这样?
我的问题不在于GC'应该'在System.gc()调用上运行。当调用子类finalize()时,为什么不调用超类finalize,即使调用是显式的。
答案 0 :(得分:0)
finalize(),它是任何对象执行清理活动的最后机会,即释放所有系统资源,如果打开则关闭连接等。
java中的finalize方法的主要问题是它不能保证JLS它将被垃圾收集器调用或者它将被调用的时间,例如,一个对象在符合垃圾收集条件并且在它完成之前可能无限期地等待( )方法被调用。同样,即使在finalize被称为无法保证后,它也会被立即收集。
由于上述原因,使用finalize方法释放关键资源或在finalize中执行任何时间关键活动是没有意义的。它可以在一个JVM中进行开发,但可能在其他JVM中不起作用。