小弟刚开始学java,碰到一个垃圾回收的疑问
  int x[];
  x=new int[100];
  x[0]=1;
  x=null;
这时如果用System.out.println(x)打印的话,会报空指针的错误,说明到这里x应该被回收了,可是如果再加一句
  x=new int[2];
编译器却能通过。x不是被回收了吗?不是应该报x变量未定义的错误吗?为什么会发生这种情况?
  

解决方案 »

  1.   

    int x[]; 
    x=new int[100]; 
    x[0]=1; 
    x=null; System.out.println(x)语句并不会报错啊。
    此时只有用x里的对象是才会报错。
    如:System.out.println(x[0]);
      

  2.   

    java的垃圾回收机制是需要一定时间的,所以会有一定的滞后性的,至于你说的问题,java回收的是堆内的没有指向它的内存,而x是在栈上分配的,所以不会被回收的。
      

  3.   

    楼上说的对X[]保存在栈内存,而new出来的对象保存在堆内存,栈内存的东西,在程序结束后消失(或者出了{}就消失),显然你的程序还没有结束之前你加一句x=new int[2]; 是完全可以的。垃圾回收指的是系统自动回收堆内存的没有任何东西指向它那些对象,这种自动清理也不一定就是立刻清理。
      

  4.   

    x类似于c当中的指针垃圾回收只会回收指针所指的区域,不会连指针一起喀嚓掉。int x[];定义一个指针
    x=new int[100];创建一个内存块,让指针指向这里
    x[0]=1;对那个内存块内容赋值
    x=null; 指针指向null(不指向任何地方),那个创建的内存块由于没有引用(没任何指针指着它),所以可能会被垃圾回收机制回收掉,也可能不会被回收——jvm的定义,并没有要求垃圾回收机制一定做什么。