//: Garbage.java
// Demonstration of the garbage
// collector and finalizationclass Chair {
  static boolean gcrun = false;
  static boolean f = false;
  static int created = 0;
  static int finalized = 0;
  int i;
  Chair() {
    i = ++created;
    if(created == 47) 
      System.out.println("Created 47");
  }
  protected void finalize() {
    if(!gcrun) {
      gcrun = true;
      System.out.println(
        "Beginning to finalize after " +
        created + " Chairs have been created");
    }
    if(i == 47) {
      System.out.println(
        "Finalizing Chair #47, " +
        "Setting flag to stop Chair creation");
      f = true;
    }
    finalized++;
    if(finalized >= created)
      System.out.println(
        "All " + finalized + " finalized");
  }
}public class Garbage {
  public static void main(String[] args) {
    if(args.length == 0) {
      System.err.println("Usage: \n" +
        "java Garbage before\n  or:\n" +
        "java Garbage after");
      return;
    }
    while(!Chair.f) {
      new Chair();
      new String("To take up space");
    }
    System.out.println(
      "After all Chairs have been created:\n" +
      "total created = " + Chair.created +
      ", total finalized = " + Chair.finalized);
    if(args[0].equals("before")) {
      System.out.println("gc():");
      System.gc();
      System.out.println("runFinalization():");
      System.runFinalization();
    }
    System.out.println("bye!");
    if(args[0].equals("after"))
      System.runFinalizersOnExit(true);
  }
} ///:~finalize()函数是什么时候被调用的?
如果我采用下面的方法执行。
java Garbage
而不指定命令行参数。我觉得finalize()函数不应该执行。可是它却执行了,请问
这是为什么呢?

解决方案 »

  1.   

    thik in JAVA中讲:垃圾回收时间是不确定的,所以finalize()函数执行也是不确定的!
      

  2.   

    永远不要指望finalize()来做任何操作
      

  3.   

    无法得知JVM何时运行finalize方法,
    但你可以使用System.gc();强制执行finalize()方法。
      

  4.   

    楼上的朋友们:
    程序的输出为:
    Created 47
    Beginning to finalize after 3486 Chairs have been created
    Finalizing Chair #47, Setting flag to stop Chair creation
    After all Chairs have been created:
    total created = 3881, toal finalized = 2684
    bye!显然finalize()函数已经被调用了,是在我不指定命令行参数的情况下调用的。
    请各位解释一下啊,我初次接触java,谢谢!!!!