class Garbage
{
    int index;
    static int count;
    Garbage()
    {
        count++;
        System.out.println("object"+count+"construct"+"创建");
        setID(count);
    }    void setID(int id)
    {
        index=id;
    }    protected void finalize()
    {
        System.out.println("object"+index+"is reclaimed"+"消毁");
    }    public static void main(String[] args)
    {
        new Garbage();
        new Garbage();
        new Garbage();
        new Garbage();
        System.gc();
    }
}
我这机子编译生成了4个对象,只有序号4对象销毁了。

解决方案 »

  1.   

    System.gc()的调用并不会直接销毁对象实例,当内存不足的时候才会销毁。至于只有一次输出,我想是因为程序运行结束后,系统将资源全部收回了。
      

  2.   

    System.gc() 只是提示JVM你想回收,但不一定会回收
      

  3.   

    2楼说的对的。
    不过运行LZ的程序居然发现4个对象都有finalize调用。
    如果LZ只看到第4个,能否在main方法最后加Thread.sleep(3000);这样的语句让程序等待一下看看结果呢?
      

  4.   

    我今天也刚刚学到这里,System.gc()只是建议JVM回收,并不一定会回收垃圾对象。
      

  5.   

    这个问题必须看这本书 "深入Java虚拟机",它会告诉你,gc的机制。和你 new 了这么多一样的对象。java是如何处理的。。
      

  6.   

    System.gc()只是告诉系统要回收垃圾,但系统会在系统认为需要的时间回收,所以时间不能确定
      

  7.   

    GC只是建议,也可能一个都不回收呢.... 这是JVM的自主行为,无法控制
      

  8.   

    呵呵,java没必要操心这个,你可以研究下C++