1、当对象要被回收的时候,调用finalize()2、因为你的程序时一直create object直到,垃圾回收开始
  而垃圾回收自动启动的条件就是为程序分配的内存的使用率达到了一定程度,需要进行回收了
  所以你new String长度却大,每一个对象占用的内存就越大,当然会提前启动垃圾回收3、还没想出来4、相差1也只是偶然,我有这样的运行结果:
GC after 6116garbages
Created=6116
Finalized= 4
因为垃圾收集是一个后台进程,与你的程序无关
差1的原因应该是:第一个对象被回收的过程正好发生在以下两个语句之间   while(!Garbage.gcrun){
new Garbage();因此,垃圾回收执行的时候,created=3929
但是,new Garbage();的执行使得,created=3930
这里牵扯到多线程的问题
如果楼主还没有看到的话,请先理解多线程机制

解决方案 »

  1.   

    finalize()不定时回收,只会调用一次
    不建议用这个方法
      

  2.   

    finalize()是在garbage collection调用回收算法去回收资源之前自动会调用的.
      

  3.   

    如果finalize()只调用一次,那么finalized的值为什么不等于1?
    第三个问题又怎么理解啊?另:我只是想了解垃圾回收机制,还没有水平用它,呵呵!
      

  4.   

    我写过一点.net的垃圾回收文章,你可以看看, 参考之. java的我还没有研究.
      

  5.   

    可以发到我邮箱里吗
    [email protected]
    谢谢!
      

  6.   

    3.System.gc()的调用并不能保证finalize()函数会立即执行,但只要内存有空隙它就会被调用,您这个小程序只会用一小部会,当然也就有足够的时间运行它,所以,在这里finalize()会被马上调用,故create=3929。
    但当没调用System.gc()时,gc会由jvm来处理,它会当某个对向真正没被用时才会清理掉,那怎么会使得jvm知道object为g呢?当然,它需要time来检测,有时gc甚至不会被调用,故create=4是有可能的,当您换一个jvm时,create就有可能不为4呢!
      

  7.   

    http://gceclub.sun.com.cn中,在线的录象讲座(中文),也许可以帮助你题目:理解Java虚拟机的垃圾回收过程
      

  8.   

    to  jeah(阿杰哥):
    如果finalize()只调用一次,那么finalized的值为什么不等于1?finalize()方法,是对象被回收的时候调用
    对于每个对象来说它只调用一次
    但是你生成了很多个对象呢 ^_^
      

  9.   

    楼主的第3个问题是不是写错了,我估计是这样的吧:
    3、Finalized的值在没有调用System.gc()的时候为什么总是等于4?而在调用了System.gc()之后它的值等于created的值?
    调用System.gc()时,终结动作会发生在所有的对象身上。 如果你把它注释掉的话, 垃圾清理只有在 可用内存数量不足 的情况下才执行垃圾回收,所以并非每个对象的finalizers会被执行。
    另外,你的程序好像和 thinking in java 上的例程很象, 你可以看看这本书上对它的解释P150。
      

  10.   

    简单的说:
       一个对象被gc回收的时候就只调用一次finalize()方法!
      

  11.   

    还有,在垃圾回收何时开始,以及如何进行,楼主不应过分追究细节
    就拿Finalized=4的情况来说
    事实上并不是定数,他跟某一次的运行状态有关我在另外一台机器上测试:
    注释掉System.gc();
    既得到过:Finalized= 3793
    也得到过:Finalized= 1497而不注释System.gc();
    也同样得到了Finalized= 3793以及Finalized= 1406所以,我认为Finalized= 4仅仅是一个巧合
    并不是定论