to study_body(珍惜每一天): 不对阿,我new了很多呢,但总是显示2遍Beginning to finalize.
public void finalize()好象不是什么时候都能够执行的。
to study_body(珍惜每一天) public void finalize()好象不是什么时候都能够执行的。 这个我知道,java的gc是等内存不够的时候才进行垃圾回收,这时候才在回收动作前调用finalize().我理解这就叫回调。可是和我的问题没关系阿。
我的理解是这样的,你new了多少对象出来,就“有可能”有Beginning to finalize.输出,仅仅是有可能而已,和内存有关系的,假如你在你机器上,new 了一百个对象,在释放了两个以后,系统认为内存够用的,所以就不再收集了,因为他不能一下子给你收拾得很干净,因为它有其它事要干。在我的机器上是显示四次的。gcrun这个变量的作是说在开始回收垃圾后就停止再产生垃圾。不知道我这样理解对不对,我也是初学的
to trilsen(正入门): 我在学校的PIII机器和家里的P166mmx(128内存,畸形电脑)上都是显示2次,怎么还会显示4次?看来还有好好研究的地方啊! 至于你的理解,我还是不太明白。 当我的程序开始垃圾回收的时候,第一次执行finalize()就将gcrun置true了,就不应该再new出对象了啊。
哦!我似乎有点想通了。比如内存里可以容纳20000个对象,当已有19000时,GarbageCollector开始启动释放到18000是,GC认为内存够用了。就停止了。这样就finalize()了1000遍,也就会输出1000行beginning to finalize. 也就是说GC启动的条件是〈1000可用的内存空间,停止的条件是2000可用内存空间。 对!就是这样!谢谢两位给我的启发。
第一次执行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出来,但在它显示出来之前,就开始回收垃圾了,所以它到最后才显示出来
不对阿,我new了很多呢,但总是显示2遍Beginning to finalize.
public void finalize()好象不是什么时候都能够执行的。
这个我知道,java的gc是等内存不够的时候才进行垃圾回收,这时候才在回收动作前调用finalize().我理解这就叫回调。可是和我的问题没关系阿。
我在学校的PIII机器和家里的P166mmx(128内存,畸形电脑)上都是显示2次,怎么还会显示4次?看来还有好好研究的地方啊!
至于你的理解,我还是不太明白。
当我的程序开始垃圾回收的时候,第一次执行finalize()就将gcrun置true了,就不应该再new出对象了啊。
也就是说GC启动的条件是〈1000可用的内存空间,停止的条件是2000可用内存空间。
对!就是这样!谢谢两位给我的启发。
你看结果出现的顺序就明白了
。
。
。
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出来,但在它显示出来之前,就开始回收垃圾了,所以它到最后才显示出来