垃圾回收的优点和原理。并考虑2种回收机制。

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【ruindays】截止到2008-06-29 04:39:58的历史汇总数据(不包括此帖):
    发帖数:0                  发帖分:0                  
    结贴数:0                  结贴分:0                  
    未结数:0                  未结分:0                  
    结贴率:-------------------结分率:-------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    thinking in java 3th 中有比較完整的說明
      

  3.   

    面试么
    thinking in java 
      

  4.   

    虚拟机规范中有讲到垃圾回收的各种算法,印象比较深的是火车算法,给大家找了点资料:火车算法的基本思路:首先,成熟对象空间被组织成为多辆火车,每辆火车挂有多个车厢。每个车厢就是一个固定大小的内存区域。火车按照创建顺序被编号为1,2,3…,车厢也按照创建顺序被编号为1,2,3…。一般的描述一个车厢为n.m,表示为第n辆火车的第m个车厢。成熟空间的对象总是从年轻代中复制过来的,不论何时需要将对象提升到成熟代时,这些对象总是被挂接到最大火车的最末车厢,或者挂接到新创建的一辆火车中。火车算法由虚拟机调度,在合适的时间来进行GC。在进行一次火车算法GC中,算法首先检查编号为1的火车(最先创建的火车),是否存在来自外部的对最小火车中对象的引用(包括Root及其他的火车、年轻代的对象等),如果不存在任何的对火车中对象的引用,那么整辆火车中的对象全部是垃圾,可以销毁。第1号火车销毁后,第2号火车变成第1号,与此顺推。如果存在对最小火车的引用,那么火车算法检查该火车的1号车厢(最早创建的车厢),并把所有被外部车厢引用的对象复制到其他车厢中,当所有的被外部引用的对象都复制完成后,剩余的对象就全部是垃圾,可以被销毁。复 制过程是这样进行的:如果这个对象被另外一辆火车中对象所引用,那么这个对象被复制到那辆火车中(如果火车已经满了,那么为它新挂一个车厢)。否则,这个 对象被复制到当前火车的尾部(如果需要,为当前火车新挂一个车厢),在复制过程中,所有指向这个对象的引用也全部更新,并指向新的位置。当对象复制到新的 车厢后,所有在对象中引用得再远1号车厢的对象也被全部的复制到该辆火车的尾部。这个复制过程最大的优势就是对大型环状对象的收集效率,比如说在一次DOM解析过程中,会创建大量的DOM对象,这些对象可能会进入到成熟对象空间中的多辆火车中。由于复制过程总是保持相关联对象在同一列火车中,因此,最后这些对象会放到一辆火车中,当火车中的其他对象被销毁后,剩余的DOM对象会成为整辆火车的全部,而被集中销毁。由于火车算法每次支队第1号火车或者第1号火车的第1号车厢进行垃圾回收,因此,其时间开销相对较低,导致的停顿时间较短,比较适合于对停顿时间要求苛刻的应用场景。但实际上,火车算法的效率并不高,在JDK5.0中,就不再推荐使用了。End!一般程序员需要知道的就是当JVM发现有一个对象不会被任何引用所指向的时候,就会回收这个对象
      

  5.   

    这里有一段关于垃圾回收的
    http://blog.csdn.net/yirentianran/archive/2008/06/12/2537985.aspx
      

  6.   

    Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
      

  7.   

    1:垃圾收集是一种从无用对象回收其所占用的内存,并使回收的内存能够被再次利用的机制。2:无用对象是指它不能被程序中处于活动状态的部分的引用。3:垃圾收集处于低优先级的线程内,当可用内存较少时运行,但不能保证何时运行。4:不可能强制运行垃圾回收线程,但是调用语句System.gc()有可能激活垃圾收集程序.5:在垃圾回收机制中,无法保证对象被垃圾回收的顺序,也无法保证 finalize() 方法被调用的顺序。6:环形引用关不能阻止对象被回收.例:class A{B b;}class B{  A a;}执行下面的程序:A  a=new A();B  b=new B();a.b=b;b.a=a;
     
    最后这二个对象都会被回收.7:我们可以设置引用变量值为null,来暗示垃圾收集线程来回收这引用变量的对象所占用的内存。如果该对象属于某监听器对象,那么,应该首先将这个监听器注销掉,否则该对象可能依然不能被垃圾回收。8:所用对象都有一个finalize方法,他是从Object类继承下来的,注意j2me中不可用.9:什么情况下垃圾回收线程会启动?一般规则是:当存在无用对象时,将启用垃圾收集线程,对无用对象占用的内存进行释放。什么是无用对象?一般规则为:没有引用指向的对象称为无用对象.10:垃圾回收线程的启动时间由虚拟机内嵌算法来进行调度,程序员无法直接调度它,它的运行只有二种情况:系统在运行过程中处于空闲状态和内存资源使用不足。11:无用对象判断方法补充:沿着对象的引用的被饱含关系追溯不到根对象或活动线程时,则这个对象被称为无用对象.如下面所示,对象A、B、C、D、E不是无用对象,而G,H是无用对象.其中main代表根对象.main
     
    A
     
    C
     
    D
     
    B
     
    E
     
    G
     
    H
     
    12:垃圾回收线程管理的内存区域:在JAVA语言中,内存的分配与其他的语言也是一样的,分为代码区、数据区、堆区、栈区,垃圾回收能够管理的内存区域仅限于堆区.在类中声明的静态数据内存分配在数据区中,因此,静态数据不会被垃圾回收线程回收.
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jsljn272/archive/2005/11/21/533677.aspx