首先,一般情况下,jvm在内存不足的时候才会进行垃圾回收!
    当没有输入引数运行你的程序,可以得出你所说的输出,
    个人看来,程序在生成第47个对象时,并没有达到内存(这里可能包括物理和虚拟的,由jvm判断)的最大值,所以,f没有置为true,对象仍然在生成,直到内存耗尽,jvm开始进行垃圾回收,这时才执行你在chair里定义的finalize()方法,当释放第47个对象时,f经过被置为true,这时,就不会再产生新的对象了。这与47没有关系,你可以在
Chair() {
    i = ++created;
    if(created == 47) 
      System.out.println("Created 47");
  }
中改为
if(created == 47) 
{
System.out.println("Created 47");
f= true;
}
,这时生成47个对象后就不会再生成了。内存没有消耗完,所以不会调用finalize 。
你自己再理解一下。

解决方案 »

  1.   

    个人认为
    每创建回收一个对象都会执行一次finalize()函数以下例子可以证实:
    public class person{
        public void finalize(){
        System.out.println("destory Object!");}
        public static void main(String [] args){
    new person();
    new person();
    System.gc();
        }
    }
    程序打出两行destory Object!程序并不是产生到第47个对象时停止产生对象,而是回收到第47个对象时停止产生对象。
    当没有提供引数运行程序时,我们知道什么时候回收垃圾吗?
    很明显,我们不知道。但是程序的结果告诉了我们。
    第一次调用finalize()函数时程序产生了5430个对象,
    当程序不再产生对象时,程序已经产生了34544个对象。为什么程序没有打出5430行字符或更多呢?
    程序用多个变量巧妙的控制了他们。一点拙见!!
      

  2.   

    java垃圾回收机制是要等没有内存时在来收垃圾的,
     比如那些没有引用的对象啦?
      

  3.   

    1.即使你手动调用System.gc(),jvm也不会立刻回收
    2.finalize()的执行由gc决定,可以执行也可以不执行,所以不能用finalize()保证释放某些资源
    3.一般来说只有内存不够了才会执行gc,所以一般的程序可能根本没有搜集垃圾
      

  4.   

    不太明白xuefeng的意思
    动调用System.gc(),jvm也不会立刻回收吗? 那么System.gc()的作用是什么呢?
    还有就是当垃圾回收释放对象时  具体有什么动作?比如上例  回收器它对i有什么动作呢?
      

  5.   

    垃圾回收是一个优先级非常低的线程,什么时候启动完全依赖JVM的实现算法.
    调用System.gc()是建议垃圾回收,但是不一定会回收,不过会加大回收的可能性.
    垃圾回收时会调用finalize方法,但是因为不知道什么时候垃圾回收,所以不要在finalize方法
    释放资源.
    垃圾回收随时都有可能运行,并不是说内存不足才启动的