class person{
    public void finalize(){
        System.out.println("the object is going!");
    }
    public static void main(String[] args){
        new person();
        new person();
        new person();
        System.gc();        System.out.println("the program is ending!");
    }
}
运行结果如下
the object is going!
the object is going!
the object is going!
the program is ending!
问题如下
1:我认为运行结果应该是
  the object is going!
  the program is ending!
  为什么强制执行回收会执行三遍?
2:谁能告诉我System.gc的运行原理?
3:finalize()怎么释放这3个匿名存储空间?
4:如果System.gc不强制运行,这3个匿名垃圾非要等到程序空闲才会被自动回收何不把这个方法直接改成手动的?

解决方案 »

  1.   

    1:我认为运行结果应该是
      the object is going!
      the program is ending!
      为什么强制执行回收会执行三遍?倒,GC 运行一次可以回收许多的垃圾,并不是执行多少遍。楼主创建的三个对象都符合收集条件,GC 在收集时调用了每一个的终止方法。2:谁能告诉我System.gc的运行原理?GC 是一个高度优先的后台线程,自动进行垃圾收集,执行收集的具体时刻不以程序员的意志为转移。3:finalize()怎么释放这3个匿名存储空间?终止方法中应该包含关闭对象使用的资源的代码(文件/数据连接),楼主的对象未使用任何特别的资源,楼主的终止方法中也不需要做什么特别的事情,终止方法是由 GC 调用的。4:如果System.gc不强制运行,这3个匿名垃圾非要等到程序空闲才会被自动回收何不把这个方法直接改成手动的?GC 的运行不以程序员的意志为转移,这是事实。可以想象其实现是高度复杂的,大多数情况下可以认为是有智能的,或者说比大多数人自己做好。
      

  2.   

    不是垃圾回收执行了三次。
    而是回收了三个变量。你每一次回收一个变量,就会调用finalize。
    当然有三行输出了。2 System.gc检查没有指针引用的变量,销毁她。
      建议看《深入java虚拟机》讲jvm实现原理的一本书。 
      还有几本专本讲语言独立的垃圾回收原理的书。
    3 不是finally释放,而是在系统释放前,系统自动调用她。让你有机会做一些收尾工作。
      释放对象不是在finally里完成的。
    4 释放时机有具体java虚拟机的实现有关。
      可以认为有一个回收线程,或者有一个回收定时器。或者其他触发机制。
      

  3.   

    System.gc()会强制执行 存在引用所有指向的对象.要强调的是:如果不用System.gc(),[只有当内存在面临耗尽时](也就是说即使你override了finalize()也不一定会执行)才会执行finalize().可以这样测试:
    for(int i=0;i<10000;i++){
           new person();
    }
    这样就会自动调用finalize()了.呵呵,有点肤浅吧...