public class TestProject{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Book b1 = new Book();
        new Book();
        System.gc();
    }
}class Book {
    @Override
    protected void finalize() {
        System.out.println("Error : checked out ");
    }
}
当我只写 Book b1 = new Book();的时候没有调用到finalize()方法,但是当我直接写new Book()时,不给定义对象的时候就会调用finalize()方法,求解

解决方案 »

  1.   

    回收是要在对象没有被任何引用之后才会发生啊!Book b1 = new Book();
    你这种写法,b1的生命周期结束,要到 main()函数执行完毕了。修改下:
    public static void main(String[] args) {
      Book b1 = new Book();
      b1 = null; // 释放引用。
      System.gc();
    }
      

  2.   

    就算写了 = null 那 System.gc 也没有作用。GC 需要在 JVM 内存达到阀值时才会开始工作。这段程序,还没轮到 GC 开始工作的时候 JVM 就已经终止了!
      

  3.   

    3楼火龙果说的很有道理,即便你调用System.gc,其实也不代表JVM的GC会立即启动。可以这么玩玩:
    public static void main(String[] args) {
      for (int i = 0; i < 9999999; i++) Book b1 = new Book();
    }
    这种情况下,其实 Book b1 每次循环都会重建,那么可以在后台看到大量的:
    Error : checked out
      

  4.   

    Java 的回收就不能很准确的执行,需要在 JVM 内存达到阀值时才会开始工作。