class Chair 
{
public static long created = 0;
public static long finalized = 0;
public static boolean gcrun = false;
public static boolean f = false;
public long i = 0; Chair(){
i = ++created;
if (i == 1)
{
System.out.println("Creating start!");
}
//System.out.print(".");

}

public void finalize(){
finalized++;
//System.out.print("-"); if (!gcrun)
{
gcrun = true;
System.out.println("Finalized start!");
}
if (i == 47)
{
f = true;
System.out.println("finalized 47 chair,"+created+" created,stop create!");
} if (finalized >= created)
{
System.out.println("All chair is finalized!");
}
}
}public class Gc
{
public static void main(String args[]){
while(Chair.f == false){
new Chair();
new String("take a few space");
}
System.out.println(Chair.created+" chair created,"+Chair.finalized+" chair finalized!");
System.out.println("Bye");
}
}1.看了think in java中关于gc和finalize的介绍,根据书上的例子写了这个程序,但是发现All chair is finalized一直在打印出来,就是说一直在调用finalize,这让我很不解,哪位帮我看看,是什么原因2.我如果把注解的部分打开,有可以得到正常结果,非常奇怪.JDK是1.4.2先谢谢大家了.

解决方案 »

  1.   

    System.out.print();是拖延时间用的.
    print()方法相对比较耗时间.不过在我机器上,如果把两个print方法都注释掉的话,程序有一定几率会出正确结果,其他情况会导致程序一直运行下去,没出现像你说的那样All chair is finalized.
      

  2.   

    up
    finalize是不定期调用的。
      

  3.   

    finalize
    自动回收没有引用的对象,即这个对象存在但没有任何引用
    而且是没有规律的
      

  4.   

    那你有看到书上类似于这样的一句话吧?“你永远不会知道JVM会在什么时候启动GC”
      

  5.   

    Microsoft Windows XP [版本 5.1.2600]
    (C) 版权所有 1985-2001 Microsoft Corp.D:\project\sjava\L4>java Gc.class
    Creating start!
    Finalized start!
    finalized 47 chair,45458 created,stop create!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    All chair is finalized!
    以上是我运行的结果.如果所有的创造对象已经finalize了,怎么会还有finalize呢,奇怪了.难道一个对象会重复finalize?
      

  6.   

    finalize是不定期调用的,而且是没有规律的这个我可以理解,但不能理解,finalized的次数大于created次数,而且一直在finalize.但这里已经停止create了.谢谢大家的关注!
      

  7.   

    问题是程序内存还在一直增加,如果不强行停止的话,系统资源会被吃完.从情况是create没有停止,从程序的执行流程来看应该是停止create了.这个情况还是不解.
      

  8.   

    zjf405(浪子阿飞) :其它的对象也会调我Chair的finalize吗?不明白.
      

  9.   

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    我试了下,有这个问题。
    你的逻辑有问题把。
      

  10.   

    而且不知道是什么东西在吃内存,应该是chiar的finalize.
      

  11.   

    i改成static的

    结束标志改成if (i >= 47),
    就可以了,我试过了。
      

  12.   

    <<Effective Java>>中提到过,不要信赖finalize,因为即使你为你的类编写了这个方法,对消销毁的时候不一定会调用它。所以很多依赖它来释放资源的程序,往往会造成内存溢出。
      

  13.   

    第二章的第六项:Finalizers are unpredictable, often dangerous, and generally unnecessary.Effective Java: Programming Language Guide =>Chapter 2 =>Item 6: Avoid finalizers Finalizers are unpredictable, often dangerous, and generally unnecessary. Their use can cause erratic behavior, poor performance, and portability problems. Finalizers have a few valid uses, which we'll cover later in this item, but as a rule of thumb, finalizers should be avoided.
      

  14.   

    谢谢大家,看来finalize真不好用.