问一个小问题:
JVM退出的时候,Object.finalize()这个方法会被调用吗?谢谢!import java.io.*;public class TestTempFile {
    public static void main(String[] args) throws Exception {
        TestTempFile ttf = new TestTempFile();;
    }
    
    protected void finalize() throws Throwable {
        System.out.println("it is finalized!");
    }
}

解决方案 »

  1.   

    Finalize方法,可以告诉垃圾回收器应该执行的操作,该方法从Object类继承而来。在从堆中永久删除对象之前,垃圾回收器调用该对象的Finalize方法。但要注意,无法确切地保证垃圾回收器何时调用该方法,也无法保证调用不同对象的方法的顺序。面的代码不可能打印出it is finalized!因为虚拟机推出之前ttf刚被创建,垃圾回收机制还不能及时判断出ttf对象已经不会再被任何线程使用了,这个时候程序已经执行完毕,虚拟机退出。自然finalize()方法也就不可能被调用而来。如果实在是想打印,可以在虚拟机退出之前手动强制回收废用的对象:
    import java.io.*;public class TestTempFile {
        public static void main(String[] args) throws Exception {
            TestTempFile ttf = new TestTempFile();
            //表示ttf已经不可能有任何线程会使用它了
            ttf = null;
            //运行垃圾回收器
            System.gc();    }
       
        protected void finalize() throws Throwable {
            System.out.println("it is finalized!");
        }
    }
      

  2.   

    也就是说,JVM退出的时候,不一定会进行垃圾回收。而finalize这个方法只是在垃圾回收的时候才会被调用,所以JVM退出的时候,不一定会调用finalize。这样说对吗?有没有相应的文档?
      

  3.   

    finalize只有垃圾回收的时候才会去调用。操作系统结束一个进程,会把那个进程申请的内存都清了,所以用不到gc
      

  4.   

    对,只有当一个程序结束时才会调用到finalize方法
    而当JVM退出时,操作系统已经清理了JVM进程的内存空间