package com.sr178.test;
public class TestA {看下面程序
public static void main(String[] args) { foo f = new foo();
foo f2 = f;
f=null;
                System.gc();
}
}
 class foo{
 protected void finalize(){
 System.out.println("该对象被回收了");
 
 }
 }
当f=null之后,f指向的内存foo对象会被垃圾回收器回收,那么变量f本身对应的内存会不会被回收啊``要是会被回收,什么时候回收的?
谢谢先```

解决方案 »

  1.   

    当然会。变量是放在 Stack 里面的,方法执行完就回收了。
      

  2.   

    另外,“当 f=null 之后,f 指向的内存 foo 对象会被垃圾回收器回收”不够准确。GC 算法在不同的虚拟机里会有所区别,Java 程序本身是不能控制的。绝大多数情况下,xxx=null 这样的语句完全没有必要写,也不需要显式调用 System.gc()。
      

  3.   

    垃圾回收(gc)是一个优先级为0的守护进程,什么时候执行是说不准的,你也不能强制执行,就算你调用System.gc()也没用foo f = new foo();
    foo f2 = f;
    f=null;    //此行执行以后,第一行创建的对象也不符合垃圾回收条件,因为第二行中的f2指向了那个对象。
    protected void finalize(){             //此方法切记处理异常,不然会编译错误吧
    System.out.println("该对象被回收了");} 
    “当f=null之后,f指向的内存foo对象会被垃圾回收器回收,那么变量f本身对应的内存会不会被回收啊``要是会被回收,什么时候回收的? ”  //这句话错的哈,当f=null之后,介于此题,f指向的内存foo对象不会被垃圾回收器回收
      

  4.   

    晕````那去掉foo f2 = f; 那句吧```我忘删了``
    谢谢````
      

  5.   

    在java中尽管存在垃圾回收器,但是依然会出现内存泄露的问题,这是因为在程序中可能存在垃圾回收器无法收集的持续存在的无用引用。当不再使用一个对象时,最好明确置对象为null,但这并不能控制垃圾回收器立刻工作,只是做到通知垃圾回收器有需要回收的对象。如果系统中可用的内存过低,系统也会自动运行垃圾回收器释放对象占用的内存资源供其他对象使用。
    所以当f=null之后,变量f本身对应的内存不会立刻被回收,只是通知垃圾回收器又需要回收的对象。
      

  6.   

    你去掉后也不一定会被垃圾回收啊。你去掉后,只能说明它符合垃圾回收的条件,但回不回收,什么时候回收是JVM的事,跟你没关系,你也管不了,你用System.gc(),只能建议JVM进行垃圾回收,但垃圾回收工作也不一定执行。反正一句话,你管不了...
      

  7.   

    f在main方法的stack frame 里,main方法执行完的时候就没有了。
      

  8.   

    虽然只是些理论知识,但了解下还是没有错的,再说SCJP那些考试就考这个...
      

  9.   

    看着有很多仁兄都理解错了我要问的问题,不过问题已经解决....当然上面也有很多人说对了...总结下当定义 foo f 的时候,首先系统将会将变量f添加到变量列表里..当定义f= new foo();时,先是在内存中生成一个foo对象,然后f再去指向这个对象.这里也会在内存中为f分配内存空间.(其实java没有栈和堆之分的,他实现的是个池,变量和对象都放在这里,不知道这个理解对不,望高手指点)当定义 f=null;时,并执行 system.gc()时(这里假定jvm马上回收内存,大家别在就个地方为难小弟了);系统就会回收变量f和对象foo的内存,但此时变量列表还有f的存在,变量列表里的f是在其走出作用域的时候被系统删除的.所以当继续赋值 f= new foo();的时候还能找到f.这个就是我现在理解的过程...如果有错误,请大家帮忙指出.....
      

  10.   

    Java中垃圾回不回收,什么时候回收是JVM的事,是没办法控制的
    用System.gc(),只能建议JVM进行垃圾回收,但垃圾回收工作也不一定执行
    JVM只是保证你在需要内存的时候,给你内存,这是其他语言没法比拟的(个人认为是JAVA最成功的 )
      

  11.   

    因为f2也指定这个对象,所以不会立即被回收,只有方法进行完了,才有可能回收。
    而且即使调用了 System.gc()方法也未必会回收,因为何时回收是由java虚拟机决定的,程序无法决定。只是向java虚拟机提出垃圾回收的建议