哈哈,因为你在循环中调用new Test();以后并不会立刻执行public void finalize(),所以嘛就建立了多个Test对象,当然也就有多个Beginning to finalize.输出了。

解决方案 »

  1.   

    to  study_body(珍惜每一天):
    不对阿,我new了很多呢,但总是显示2遍Beginning to finalize.
      

  2.   

    public void finalize()好象不是什么时候都能够执行的。
      

  3.   

    to study_body(珍惜每一天) 
     public void finalize()好象不是什么时候都能够执行的。
    这个我知道,java的gc是等内存不够的时候才进行垃圾回收,这时候才在回收动作前调用finalize().我理解这就叫回调。可是和我的问题没关系阿。
      
     
      

  4.   

    我的理解是这样的,你new了多少对象出来,就“有可能”有Beginning to finalize.输出,仅仅是有可能而已,和内存有关系的,假如你在你机器上,new 了一百个对象,在释放了两个以后,系统认为内存够用的,所以就不再收集了,因为他不能一下子给你收拾得很干净,因为它有其它事要干。在我的机器上是显示四次的。gcrun这个变量的作是说在开始回收垃圾后就停止再产生垃圾。不知道我这样理解对不对,我也是初学的
      

  5.   

    to  trilsen(正入门):
    我在学校的PIII机器和家里的P166mmx(128内存,畸形电脑)上都是显示2次,怎么还会显示4次?看来还有好好研究的地方啊!
    至于你的理解,我还是不太明白。
    当我的程序开始垃圾回收的时候,第一次执行finalize()就将gcrun置true了,就不应该再new出对象了啊。
      

  6.   

    哦!我似乎有点想通了。比如内存里可以容纳20000个对象,当已有19000时,GarbageCollector开始启动释放到18000是,GC认为内存够用了。就停止了。这样就finalize()了1000遍,也就会输出1000行beginning to finalize.
    也就是说GC启动的条件是〈1000可用的内存空间,停止的条件是2000可用内存空间。
    对!就是这样!谢谢两位给我的启发。
      

  7.   

    第一次执行finalize()就将gcrun置true了,确实没有再new出对象了啊,不然的话就死循环了。
    你看结果出现的顺序就明白了



    mproject.Test@fd68b1
    mproject.Test@e45076
    mproject.Test@15e9756
    mproject.Test@121ab80
    Beginning to finalize.
    Beginning to finalize.
    Beginning to finalize.
    Beginning to finalize.
    mproject.Test@1827284它是先new 了一大堆对象出来,结果发现内存不够了,然后就回收(回调)了4个,这有什么问题吗?至于最后一个,你可以理解成它先new出来,但在它显示出来之前,就开始回收垃圾了,所以它到最后才显示出来