在释放第1号对象和第5000号对象的时候,对象计数器都是34541个,而此时f为false,应该还可以创建对象啊,难道因为finalize(),系统都不运行主程序了?如果是这样,直接把 gcrun = true放到finalize结尾不就可以了吗?为什么书上要多此一举来一个if i==47 ? (我这里是if i==5001)

解决方案 »

  1.   

    上面第三行错了,应该是:
    如果是这样,直接把 f = true放到finalize结尾不就可以了吗?
      

  2.   

    垃圾回收器只回收那些不再使用的对象,与创建对象没有关联。
    请楼主在仔细看看垃圾回收器运作方式这个篇幅,垃圾回收器会从stack和static storage两个存储空间上的reference进行深层遍历,追踪不到的对象才会被回收。
    String s = new String("now i'm going to dead!");
    s = null;
    那么在确保没有reference指针指向的情况下,这个字符串就真正死亡了,等待垃圾回收器来回收其空间。
    如果从底层reference也遍历不到的reference集同样也会被回收,包括它们指向的对象内存空间。
      

  3.   

    回复: jerrysoft(阿吉) 
       你没有看懂我的意思,我问的不是什么情况下回收(这点书上已经讲的很清楚了),我问的是垃圾回收器在回收那些不再使用的对象的同时,系统是否还会创建新的对象,即创建对象和垃圾回收是否可以交错运行。如果可以,书上那句if i==47的时候停止创建对象的话不就是多余的吗.你说的“垃圾回收器只回收那些不再使用的对象,与创建对象没有关联”我觉得不对,因为从上面的程序看,在回收第一个到第5000个对象的时候,总的对象数没有增加,我觉得此时候对象创建被暂停了。