根据GC的工作原理,我们可以通过一些技巧和方式,让GC运行更加有效率,更加符合应用程序的要求。  以下就是一些程序设计的几点建议。  1.最基本的建议就是尽早释放无用对象的引用。  大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null。
摘自http://wz.csdn.net/url/781480/
-----------------------------------------------------------------------------------------------------------
上面最后一句话的意思是不是说即使引用变量退出活动域之后,该引用变量依然存在,垃圾回收器就不会回收该引用指向的对象?如果让垃圾回收器回收无用的对象,则只能显示该指向该对象的引用变量置为null或者重新指向一个对象?“大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null。”对于这句话谁又能给一个例子?

解决方案 »

  1.   

     public void test(){
            String str=new String("Hello");
        }
    这样的情况,方法执行完后,引用变量str也就不存在了(自动退栈),但是它原来指向的对象依然在栈里面,这样看GC什么时候回收了.这个对象可能存在很长时间.GC也会根据内存状况决定是否进行回收.
      

  2.   

    你的意思是在引用变量的作用域之外,该引用变量指向的对象就可以被GC回收了?不需要在退出作用域之前显示的写上这段代码:str = null;
      

  3.   

    这种情况是,但是具体什么时候回收是不确定的 。
    str=null;
    这样的写法肯定是方法中还有很多其他的代码,但是str到此已经没有用了,直接设置为null。这样str原来指向的对象就是GC可以回收的了 。
      

  4.   

    只要超出引用变量的作用域范围,该引用变量就直接置为null了,你是这个意思吗?
      

  5.   

    不是,超出作用域范围str这个变量已经不存在了,出栈操作 。
      

  6.   

    str变量出栈了,str指向的对象也就不会被达到,所以他的效果和str=null是一样的,str指向的对象也会被GC回收,你是这个意思吗?
      

  7.   

    str指的对象没有引用执行了,GC会发现这个对象成为垃圾,需要的时候就回收掉。
      

  8.   

    刚好看到JAVA编程思想里的关于这个例子的解释。
    说是会自动回收垃圾的。
    不过我对JAVA的自动回收的工作原理还不了解。所以不敢瞎说。