In the following code, which is the earliest statement, where the object originally held in e, may be garbage collected:
  1.public class Test { 
  2.  public static void main (String args []) { 
  3.    Employee e = new Employee("Bob", 48); 
  4.    e.calculatePay(); 
  5.    System.out.println(e.printDetails()); 
  6.    e = null; 
  7.    e = new Employee("Denise", 36); 
  8.    e.calculatePay(); 
  9.    System.out.println(e.printDetails()); 
 10.  } 
 11.}Only One: 
1) Line 10
2) Line 11
3) Line 7
4) Line 8
5) Never
Answer:3
为什么不是Line 6呢???
我自己的理解是:判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个: 
1.给对象赋予了空值null,以下再没有调用过。 
2.给对象赋予了新值,既重新分配了内存空间。
到Line6时,已经符合1了,所以我会选择Line6.可是答案是第七行啊??为什么啊????

解决方案 »

  1.   

    e要是被别的对象引用,那line6就不符合垃圾收集器收集标准
    个人理解
    e是否被别的对象引用好像也无法判断,所以答案也就没有给
      

  2.   

    e=null 表示e可以成为回收的候选对象
    所以最早在第7行被回收
      

  3.   

    e是对象的一个引用,e=null说明e这个引用没有指向对象,而原来的对象没有变,只是没有引用指向它,但该对象还存在内存空间里.当垃圾收集器运行时确定这个对象没有引用指向它时,便释放它.
      

  4.   

    e=null 这不是销毁一个对象,仅仅是把对该对象的引用去掉
    在java中一个对象可以被多个对象引用
    只有在该对象不再被引用时才会垃圾收集例如
    A  a=new A()
    A b =null;
    b=a;
    这样就有两个对new A()对象的引用 
    当a=null;时
    new A()对象依然被b引用,是不会垃圾收集的所以
    6.    e = null; //这里不调用e.finalize()方法,jvm只是把e对象标记为不引用
    7.    e = new Employee("Denise", 36); //这时才能确定e原来的对象被永久抛弃,他将会被kill
      

  5.   

     当e = null的时候 gc不是马上就回收了资料,等一段时间后才回收 
      

  6.   

    垃圾回收不是绝对的,有的是需要自己手动销毁的
    JVM不到内存感觉不够用的时候,一般是不会开始回收的