这个例子有个错误作者认为只要调用了JVM就会强制进行垃圾回收
然而事实不是这样的因为System.gc();只是一个‘建议’,不是‘命令’
回收与否在于JVM自己,程序是无法干涉的

解决方案 »

  1.   

    我不明白的是。里面的finalize()中的finalized是怎么变成 32491的,这是怎么运行的原理??
      

  2.   

    简单的说一下吧。在main函数中
        while(!Chair.f) {
          new Chair();
          new String("To take up space");
        }
    这个循环不断地生成Chair和String的对象,这个过程不断地分配资源,当系统资源被用到一定的时候,jvm就会用调用garbage collector, 用finalize()函数来回收被分配出去而且在后面不会再引用的资源。其实你可以理解为java在后台自动地为你回收资源。
    注意在finalize()中,每释放一个对象,变量fianlized++,所以它就会变成32491了
      

  3.   

    当created的值是3374了(也就是i的值),就打印了Beginning to finalize after 3374 Chairs have been created,那后面的if(i==47)就打印Finalizing Chair #47, Setting flag to stop Chair creation怎么还会执行呢?那到底是什么时候才执行finalize()的?
      

  4.   

    finalized 是一个static变量,而i却不是。
    当垃圾开始回收的时候,他开始一个个回收,当回到到i=49的这个对象的时候,它就会打印出Finalizing Chair #47, Setting flag to stop Chair creation这句话,可是他还在继续回收别的chair而总共产生的chair就是那个staitc变量finalized 了
      

  5.   

    搂住,其实你把垃圾回收的机制想错了,你肯能以为垃圾回收器一次把整个产生的对象回收了,所以就不可能执行if(i==47)后面的语句,我认为,由于除了i以外每个域成员都是static的,所以产生的Chair对象对公用他们,而i呢,每个Chair对象都拥有他的一份拷贝,也即是每个Chair对象中可能含有的i值不同,当系统调用finalize方法时,是根据它此时回收的对象中的i值来执行的,所以if(i==47)后的语句会执行,不仅如此,而且当i=其他的值(在产生对象数量之内),其中很多值都会执行,不信,你可以些几条语句进行测试一下!
    这是我的想法,大家交流一下!
      

  6.   

    首先我先谢谢 blasterboy(自由给与我力量。支持O'Reilly) 和zhutouzip(红尘无罪,青春无悔!) 的详细解答,我还发现假如在里面多加一条类似这样的语句如: if(i == 30) {
          System.out.println(
            "Finalizing Chair $47, " +
            "Setting flag to stop Chair creation");
           }
    那个finalized会减少一次,这个怎么会这样的,还有就是,是不是只有把垃圾都回收完后才执行System.out.println(
          "After all Chairs have been created:\n" +
          "total created = " + Chair.created +
          ", total finalized = " + Chair.finalized);
    关注中…………