一句话,就是java 根据什么来确定什么时候回收对象?

解决方案 »

  1.   

    在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个: 
    1.给对象赋予了空值null,以下再没有调用过。 
    2.给对象赋予了新值,既重新分配了内存空间。 
    如;
    程序段1: 
    1.fobj = new Object ( ) ; 
    2.fobj. Method ( ) ; 
    3.fobj = new Object ( ) ; 
    4.fobj. Method ( ) ; 
    问:这段代码中,第几行的fobj 符合垃圾收集器的收集标准? 
    答:第3行。因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。 
    程序段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也符合垃圾收集器的收集标准。 
      

  2.   

    那么垃圾收集器和finalize() 有什么关系?
    renrzg(renrzg):你的意思是不是 
    while(!Chair.f) {
    Chair kk= new Chair();
       }
    中,每次循环都对象都被回收了?
      

  3.   

    1.每一个对象都有一个finalize( )方法,这个方法是从Object类继承来的。 
    2.finalize( )方法用来回收内存以外的系统资源,就像是文件处理器和网络连接器。该方法的调用顺序和用来调用该方法的对象的创建顺序是无关的。换句话说,书写程序时该方法的顺序和方法的实际调用顺序是不相干的。请注意这只是finalize( )方法的特点。 
    3.每个对象只能调用finalize( )方法一次。如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。 
    4.垃圾收集器跟踪每一个对象,收集那些不可到达的对象(即该对象没有被程序的任何"活的部分"所调用),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。既然每个对象只能调用一次finalize( )方法,所以每个对象也只可能"复苏"一次。 
    5.finalize( )方法可以明确地被调用,但它却不能进行垃圾收集。 
    6.finalize( )方法可以被重载(overload),但只有具备初始的finalize( )方法特点的方法才可以被垃圾收集器调用。 
    7.子类的finalize( )方法可以明确地调用父类的finalize( )方法,作为该子类对象的最后一次适当的操作。但Java编译器却不认为这是一次覆盖操作(overriding),所以也不会对其调用进行检查。 
    8.当finalize( )方法尚未被调用时,System. runFinalization( )方法可以用来调用finalize( )方法,并实现相同的效果,对无用对象进行垃圾收集。 gxc_csdn(火箭炮) 你的事例符合我说的垃圾回收的两个标准的第二点2.给对象赋予了新值,既重新分配了内存空间。 既符合垃圾回收
      

  4.   

    renrzg(renrzg) 既然你说我的示例符合第2点,也就是说符合垃圾回收,但是是不是马上被回收掉了?
    如果被回收掉了,根据“在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。”,那么应该调用finalize( )方法。但是,我最顶上的程序可以测出,实际上是创建了2907个对象后,才开始调用finalize( )方法。这是为什么?是不是,“符合垃圾回收”并不是马上回收?
      

  5.   

    我觉的我们的注意力应该集中于如何解决问题,至于地层是如何运行的,一般是有能力就去研究,没有就不用了。毕竟那种搞地层的人不多。我把jdk的source code down下来,看了几天,还是看不出是如何运行的。毕竟还没有到cpu那层搞过东西,而且限于Intel,他那里各种cpu 和os 都有的.
      

  6.   

    我现在是在学习,主要是想尽量的搞懂,这应该对深入了解java有帮助的。对以后的应用应该也有很大的帮助
      

  7.   

    Java的语言说明只定义了回收规则时系统可以回收该对象,但并未定义是否立即回收;而实际上Java也不是立即回收的,这可以在很多地方查到的。