解决方案 »

  1.   

    建议不要去研究Finalize这个方法,没啥意义。直接丢弃这个方法吧,当初设计这个方法的人也许一个c++程序员,然后一拍脑袋就想到了这个一个方法。我做java十多年,从来就没用过这个方法,而且在我的思维里面也从来就没有认为java还有这个方法。潜意识里面都已经抛弃这个方法了。
      

  2.   

    猜想只是对于 weak reference , sort reference 之类的略有影响吧,正常的我们不应该依赖这个方法,最好是不要使用它。
    具体 finalize () 做了什么也不知道。至于你提到的先 finalize 再扫描一次才回收,从逻辑上理解是正常的,因为这个对象可能引用了其它对象,finalize 后立即回收时可能它所引用的对象的关系链(很多互相引用)不一致,还是需要重新分析一次,不如直接把回收的过程单独提出来放在另一步处理。Think in Java 第一版介绍了触发  GC 的步骤:System.gc();
    Runtime.getRuntime().runFinalize();连作者都奇怪为什么当初 GC 是这么设置,他觉得是两个中的一个就是好了:System.gc();或:Runtime.getRuntime().runFinalize();
    System.gc();
      

  3.   

    第一遍垃圾回收,把有finalize的对象放到单独的线程去执行。
    第二遍垃圾回收,清除调所有的对象,某些对象的finalize的时间比较长,但是也被清掉了,这是不是就是导致finalize结果不确定的原因。如果是这样并不是很合里啊。
      

  4.   

    第一遍垃圾回收,把有finalize的对象放到单独的线程去执行。
    第二遍垃圾回收,清除调所有的对象,某些对象的finalize的时间比较长,但是也被清掉了,这是不是就是导致finalize结果不确定的原因。如果是这样并不是很合里啊。