我试了好几遍都不行

解决方案 »

  1.   

    finalize()是垃圾被回收前一定会被执行的方法,但垃圾回收是系统在后台执行的,系统不一定马上回收。
      

  2.   

    我个人理解:会调用但是问题是谁也不知道什么时候会被调用,前提当然是这个DD已经是垃圾与其说垃圾回收,不如说是垃圾提醒你调用.gc方法只是告诉它可以回收了,这里有个垃圾至于它什么时候来做这个动作。就没有谁知道
      

  3.   

    但是thinking in java不是说调用gc方法一定会调用finalize方法么?
    可能是我没有理解清楚
      

  4.   

    真不知道楼主是怎么试的:public class GCTest {
      private String id;
      public GCTest(String id) {
        this.id = id;
        System.out.println(this + " is created.");
      }
      public String toString() {
        return this.id;
      }
      public void finalize() {
        System.out.println(this + " is garbage collected.");
      }
      public static void main(String[] args) {
        new GCTest("object a");
        //or rather:
        //GCTest a = new GCTest("object a");
        //a = null;
        GCTest b = new GCTest("object b");
        System.gc();
      }
    }输出:
    object a is created.
    object b is created.
    object a is garbage collected.因为第一个对象创建以后没被任何变量引用,所以被视为垃圾对象,(用我注释里面的二条语句代替第一句,效果也一样),而第二个对象一直被变量所引用,所以不被视为垃圾对象,GC也就不会去回收它。
      

  5.   

    不一定,事实上大部分情况下gc都不会运行!
    程序退出时jvm已经退出,还要垃圾回收干吗!
      

  6.   

    不一定执行吧,我个人理解System.gc();只是建议JVM进行垃圾回收处理,但是并不是执行了System.gc();就一定得调用finalize()来回收垃圾的!
    也就是说很多时候System.gc();不会有任何可见的效果!
      

  7.   

    晕楼上一个。
    finalize()是用来回收垃圾的?!! 晕死!
      

  8.   

    谢谢Dan1980(不用IDE的大傻瓜) 
    就用你的程序来说,我多谢了个GCTest test = new GCTest("object a");
    然后就不行了为什么呢?
      

  9.   

    to 楼上:
    你将对象引用赋给了变量test,而过后没有用test = null来释放其引用,这个对象就一直不是垃圾对象,因此也就不能被gc回收。
      

  10.   

    使用System.gc();效果只是将其标为垃圾,等到垃圾车来的时候才会认得出来。
    而不是用它来召唤垃圾车,立马把他清走。