3.interface Animal { void makeNoise(); } 
4.class Horse implements Animal {  
5.Long weight = 1200L; 
6.public void makeNoise() { System.out.println("whinny"); } 
7.} 
8. public class Icelandic extends Horse { 
9. public void makeNoise() { System.out.println("vinny"); } 
10. public static void main(String[] args) { 
11. Icelandic i1 = new Icelandic(); 
12. Icelandic i2 = new Icelandic(); 
13. Icelandic i3 = new Icelandic(); 
14. i3 = i1; i1 = i2; i2 = null; i3 = i1; 
15. } 
16. }
问题 是 当运行到15行的时候 ,有多少个对象被回收?

解决方案 »

  1.   

    4个
    在new第一个子类实例的同时,一个父类的实例同样被new出来了,因为你调用了父类的构造方法。而第二个子类去new就不会在new新的父类实例了。所以总共new出来了四个实例,子类为null,父类没有再去引用,一样要被回收,就有四个被回收了。
      

  2.   

    一下想通了 最后存在的是 i2 和 i1,i2,i3的3个父类 
      不知对不对,,可惜不能给自己分 那个高手能否给我确定下 我思考的对不对?
      

  3.   

    我的答案是 回收了3个对象。
    第14行的执行结果:
      i3 = i1; -----i3指向i1。i3处于可回收状态。
      i1 = i2; -----i1指向i2。但i3指向i1,所以i1不可回收。
      i2 = null; ---i2处于可回收状态。同时由于i1也指向i2,i1也处于可回收状态。
      i3 = i1; -----i3指向i1。i1处于可回收状态,故i3也可回收。第15行执行结果:
      java垃圾回收器回收i1,i2,i3。望指正。i3 = i1; i1 = i2; i2 = null; i3 = i1; 
      

  4.   

    Long weight = 1200L;这个不是对象么?
    一个父类的实例同样被new出来了!这个还真不知道
    期待解答
      

  5.   

    到最后 应该是 回收了4个对象原来i1指向的对象  i3 指向的对象  还有  i1 的weight指向 对象 和i3 的weight指向 对象 
      

  6.   

    楼主好专业啊
    Icelandic i1 = new Icelandic(); //1
    Long weight = 1200L;//2
    Icelandic i2 = new Icelandic(); //3
    Long weight = 1200L;//4
    Icelandic i3 = new Icelandic();//5
    Long weight = 1200L;//6i3 = i1;//i3指向i1指向的对象,i3原对象等待被gc 同时Long weight = 1200L;//6  等待被 gc
    i1 = i2;//i1指向i2指向的对象,i1原对象被i3引用所指向所以不会被gc
    //到这里i3指向原来在i1的对象 i1指向原来在i2对象
    i2 = null;//i2所指向对象被i1所指向,所以不会被gc
    i3 = i1;//gc  i3所指向在对象被gc,即原i1所指向的对象被gc
    //所以最后剩下 原i2所指向的对象没被gc
    被gc的是 原i1 和i3所指向的对象,2个 ,还有这二个对象中的Long weight = 1200L; 这个对象,又是2个
    所以是4个ps:前面把题目看错了
      

  7.   

    jvm规范并没有要求垃圾回收,只是说jvm实现者必须以某种方式管理内存所以,如果某种实现不实现垃圾回收机制,而只是报OutOfMenoryError,也是没问题的所以,你这个问题是没有答案的
      

  8.   

    在Java中谈回收对象,记起了当初上学时学习C++的析构函数了
      

  9.   

    垃圾回收器不一定及时回收
    运行到15行,程序结束了,所有对象都被回收
    子类对象被创建,独立的父类对象没有创建(否则所有类都源于Object,一个程序要创建多少object对象),该“父类对象”存在于子类对象中,和子类对象共同存亡,但不能算一个独立的对象
      

  10.   


    楼主这是java的GC回收机制,请多看看书
      

  11.   

    回收两个,第一个和第三个Icelandic i1 = new Icelandic(); 
    Icelandic i2 = new Icelandic(); 
    Icelandic i3 = new Icelandic(); i3 = i1;
    /*i3释放当前持有对象的句柄,改换成第一个对象,那么第三个对象的句柄被所有变量放弃,第三个对象等待回收,这时i1和i3持有相同对象的句柄,即第一个对象。*/i1 = i2;
    /*i1释放第一个对象的句柄,改换成第二个对象,但是第一个对象的句柄仍被i3持有(上一步执行的),不会被回收。所以此时i1和i2持有相同对象的句柄,即第二个对象,i3持有第一个对象的句柄。*/i2 = null;
    //i2释放自身所持有的句柄,但是i2原有对象的句柄被i1持有,不会回收。i3 = i1; /*i3释放自身持有对象的句柄(第一个对象),改为和i1一样(第二个),i3原持有第一个对象的句柄已经被释放,所以第一个对象也将等待方法结束回收。此时i3和i1持有的是相同的第二个对象的句柄。*///所以,这里有两个对象的会被回收,就是第一个对象和第三个对象。
      

  12.   

    而且如果算上父类对象就是6个对象回收,对象本身加上父类Horse 加上Object就是三个,所以第一个和第三个共有6个对象回收。顺便说一下,方法结束时局部变量所持有对象的句柄会被全部销毁。除非方法外部仍有变量持有该句柄,否则全部销毁。按照你的题目在真正执行过程中将是3个对象加上其父类共9个对象在方法结束时将被全部销毁。
      

  13.   

    Java的对象回收,是异步的。有专门的回收线程进行对象资源的回收。
    上述程序,在执行至15行时,只保留了一个对象的引用,其余两个生成的对象,都未能存在引用。
    在15行过后,main方法完毕,所有引用都会被销毁,对应的对象也就都没有被引用了。
    对于未被引用的对象,回收线程会根据回收算法进行回收。
    所以,只能说,当程序执行至15行时,有多少对象可以被回收。
    而不是,一定,被回收。
    这样的情况下,应该是有2个对象,被放入回收队列,等待被回收。
    有些情况下,并不是调用System.gc方法,未引用的对象就一定会被回收的。
      

  14.   

    你知道sun hotspot的内存管理机制吗?你知道IBM J9的内存管理机制吗?你知道JRockit的内存管理机制吗?你知道OpenJDK的内存管理机制吗?还有那个不被sun和oracle授权的apache的harmony的内存管理机制么jvm根本就没要求垃圾回收,只是说要管理内存具体还是请看看《The Java Virtual Machine Specification》Second Edition再说不要老盯着sun的hotspot,它也只不过是Java Virtual Machine Specification的实现之一,什么叫Specification?懂么!?
      

  15.   

    以下摘自《The JavaTM Virtual Machine Specification》 Second Edition  chapter 3.5.3 HeapThe heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated. The Java virtual machine assumes no particular type of automatic storage management systemand the storage management technique may be chosen according to the implementor's system requirements.
      

  16.   

    JAVA 的垃圾回收机制是不定时的,没有人知道什么时候回收回收启动。
    除非 System.gc();
    如果内存不够的时时候 是一定会启动回收机制的。