已经可以回收了 回收不回收由JVM的策略决定。

解决方案 »

  1.   

    已经可以回收了 实际什么时候回收由JVM的策略决定。
      

  2.   

    是不是所有不为null的对象最后都成为不能被回收的垃圾?
    如果是那样不是要把所有对象都设为NULL,才行。
      

  3.   

    当对象的引用不再存在的时候,对象将被回收。
    把对象设置为NULL并不能促使对象被回收,因为对象的引用仍然存在,虽然它指向的是NULL。
    JAVA的垃圾回收机制几乎不用我们去理会的。当对象的生命周期终结的时候,其引用将不再存在,对象也将被回收。
      

  4.   

    请弄清楚对象引用和对象本身的区别。
    只有对象本身才有垃圾收集一说,条件是所有指向这个对象的引用变量统统消失或者不再指向它。对象引用变量没有垃圾收集的概念。对于局部变量,一脱离作用域它就立马消失。一个局部变量的值不管是什么--是null,还是指向某个对象--只要他脱离作用域,它就消失。
      

  5.   

    回复人: chenxuwen(小白) ( ) 信誉:100  2004-04-20 18:21:00  得分:0 
     
     
      当对象的引用不再存在的时候,对象将被回收。
    把对象设置为NULL并不能促使对象被回收,因为对象的引用仍然存在,虽然它指向的是NULL。
    JAVA的垃圾回收机制几乎不用我们去理会的。当对象的生命周期终结的时候,其引用将不再存在,对象也将被回收。
     
     
    =============================错误,   把对象设置为NULL , 则对象可以被收集,实际什么时候收集要根据JVM策略。
      

  6.   

    java虚拟机可以决定是否被回收
      

  7.   

    public Object function1()
    {
    Object a=new Object();
    return a;}
    public void main()
    {
    Object a=function1();
    }
    如果一脱离作用域它就立马消失,那Object a=function1();就不能得到引用了。
      

  8.   

    to bs221cn:
    Object a= functionl();
    实际上是创建了这个实例,因此并没有脱离作用域
      

  9.   

    java虚拟机决定是否回收
    一般是系统内存即将用完,而且变量不在使用时
      

  10.   

    回复人: bs221cn() ( ) 信誉:100  2004-04-21 09:01:00  得分:0 
     
     
      public Object function1()
    {
    Object a=new Object();
    return a;}
    public void main()
    {
    Object a=function1();
    }
    如果一脱离作用域它就立马消失,那Object a=function1();就不能得到引用了。
     
     
    ======================================你的方法main有错误,编译不能通过,你一定要这样写public static void main() 
    小错误而已,呵呵呵呵
      

  11.   

    to : game0ver12345(sfsfdsfdsdfsf)你错了吧?改成public static void main()才会‘编译不能通过’
      

  12.   

    回复人: bs221cn() ( ) 信誉:100  2004-04-22 11:16:00  得分:0 
     
     
      to : game0ver12345(sfsfdsfdsdfsf)你错了吧?改成public static void main()才会‘编译不能通过’ 
     
    ==============================你说对了,是我错了。靠,犯了低级错误,没脸。
      

  13.   

    to bs221cn() 
    -----------------------------
    public Object function1()
    {
    Object a=new Object();
    return a;}
    public void main()
    {
    Object a=function1();
    }
    如果一脱离作用域它就立马消失,那Object a=function1();就不能得到引用了。
    --------------------------------------怎么不能得到引用?引用(句柄,handle)的传递是传值的,是复制的。方法内的a作为局部变量是消失了,但是在main里面你不是声明了新的引用Object a吗?
    其实关键还是要搞清楚引用和对象是两码事。引用遵循作用域的规则,而作用域的检查是编译期决定的;对象的回收由垃圾收集机制负责,那是运行期的概念。
      

  14.   

    给对象赋予了空值null,以下再没有调用过。 2.给对象赋予了新值,既重新分配了内存空间。
    程序段1: 
    1.fobj = new Object ( ) ;
     2.fobj. Method ( ) ; 
    3.fobj = new Object ( ) ; 
    4.fobj. Method ( ) ; 
    问:这段代码中,第几行的fobj 符合垃圾收集器的收集标准? 
    答:第1行。因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。这种类型的题在认证0考试中是最简单的。 
    程序段2: 
    1.Object sobj = new Object ( ) ; 2.Object sobj = null ; 3.Object sobj = new Object ( ) ; 4.sobj = new Object ( ) ; 
    问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准? 
    答:第1行和第3行。因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。 
    如果有一个对象的句柄a,且你把a作为某个构造器的参数,即 new Constructor ( a )的时候,即使你给a赋值为null,a也不符合垃圾收集器的收集标准。直到由上面构造器构造的新对象被赋空值时,a才可以被垃圾收集器收集。
    总之,在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个: 
    1.给对象赋予了空值null,以下再没有调用过。 2.给对象赋予了新值,既重新分配了内存空间。
      

  15.   

    不用设置为null,也不是设置为null了马上就会被回收
    jvm每隔一段时间会启动gc收集无用对象,还有就是内存即将分配完毕后也会启动
    对大多数新手这种问题不用去刻意留意,java不要求也不希望用户管理内存
      

  16.   

    http://expert.csdn.net/Expert/topic/2868/2868335.xml?temp=.9057581
      

  17.   

    http://expert.csdn.net/Expert/topic/3014/3014179.xml?temp=.6822168