绝对谈不上“对GC的回收机制比较熟悉”,只知道一点点 GC 常识而已。GC 总是在后台运行,你不能确定它何时执行,也就是说它的运行(何时执行清理)不以程序员的意志为转移。当一个对象成为不可访问的时候(没有任何引用指向它了),称“符合垃圾收集条件”。一般情况下,都会在一个合理的时间内得到清理。因为 GC 的运行要一定的成本,因此,在编程中应当适当考虑减少 GC 的负担,一般不要大量地创建生命期非常短的小对象就行了。

解决方案 »

  1.   

    java不是已经说了等到系统没有内存可用的时候才会进行垃圾收集么
      

  2.   

    set a = null;有时候是没有必要为了这些特意去做, 比如局部变量。主要是给予 变量比较准确的可见性,不要让他们在应该释放时还保持着未期望的引用。
      

  3.   

    可以调用System.gc();进行垃圾回收。
      

  4.   

    即使System.gc()也不是马上进行回收,分配空间是在定义变量的时候,例如PersonBean bean = null ;  ( 如果仅仅定义一个引用其实并没有分配空间,PersonBean bean ;)
    回收的时刻不确定,但条件确定,就是当这个实例没有被引用,或者引用他的实例都被置null .
    gc会在适当的时刻回收,此时可具体不定。
      

  5.   

    GC回收的时机是不确定的,你的代码不应依赖GC的回收时机。
    GC也有很多算法:懒散机制,遍历机制等,有兴趣你可以google一下。
      

  6.   

    不过,对一些全局的变量,在确定废弃时应该显式的null
      

  7.   

    为什么SUN不把垃圾回收让程序员去控制呢?这样不是更好吗?
      

  8.   

    内存回收是不同线程里运行的,
    与用户程序线程不同步,
    也就是说内存的回收对于程序开发者来说是不可控的.
    听说这是为了让程序运行更安全,解放程序员,不用自己回收空间
    又听说现在的JAVA的GC改进了,性能更好.看过一点点书.
    .NET采用三代GC策略,JAVA采用二代GC策略(分为主,次两个)
      

  9.   

    大家请看这篇文章
    http://mywelt.net/?q=comment/reply/524
    我比较认同作者的观点。我觉得一些占用内存资源的对象,应该在使用完后,赋一个NULL值。因为一个给一个对象赋NULL值,就等于告诉垃圾回收器,这个对象已经没有被引用,这时,一旦GC运行时,就会被回收。
      

  10.   

    那我如果一开始初始化String s=null会启动GC吗?
    是String s="";好还是String s=null;好啊?
      

  11.   

    suyejun2005 ,你看看我上面所说的,你提这个问题是没理解好我上面的几段话。
      

  12.   

    当一个对象有一个或一个以上的对象引用指向它时,这个对象处于有效状态。当没有一个引用指向它时,该对象被废弃。
    但是,被废弃并不意味着它所占有的空间被回收。只有当Java的垃圾回收机制认为该回收此空间时才被回收。你可以在你的代码里写:
    System.gc()
    但是,这并不能使回收立即发生。System.gc()只是催促,而不是命令。在你的Java代码里,没有办法可以真正控制回收动作。
      

  13.   

    谢谢terry_yip,我不是在质疑你,我只是想问一下如果String s=null,系统一开始会不会给它分配内存啊?如果分配了内存,但是我程序后面没有用到这个s,那么s肯定会被GC的,如果没有分配显然是最好的,因为没有无故地去浪费内存了
    所以我想问一下String s=""是不是被分配内存的?两种定义方式在写程序的时候哪个比较常用呢?谢谢