在java里面不是有一个finalize函数吗?它是如何运行的啊?在什么时间?当时的内存是什么状态啊?
还有就是dispose的用法如何?希望高手指点啊?

解决方案 »

  1.   

    finalize方法是在gc回收之前会执行,你可以在此把一此没用的资源置为null,但什么时执行finalize还得由jvm执行,因为程序员无法知道那个对象什么时被回收。看看垃圾回收方面的资料,讲得细!
      

  2.   

    一般情况下不用自己调用 finalize
    除非你用jni 加载了其他模块,可以用 finalize 清除内存
      

  3.   

    看看scjp中对gc方面有关finalize的介绍吧!9.每一个对象都有一个finalize( )方法,这个方法是从Object类继承来的。 
    10.finalize( )方法用来回收内存以外的系统资源,就像是文件处理器和网络连接器。该方法的调用顺序和用来调用该方法的对象的创建顺序是无关的。换句话说,书写程序时该方法的顺序和方法的实际调用顺序是不相干的。请注意这只是finalize( )方法的特点。 
    11.每个对象只能调用finalize( )方法一次。如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。 
    12.垃圾收集器跟踪每一个对象,收集那些不可到达的对象(即该对象没有被程序的任何"活的部分"所调用),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。既然每个对象只能调用一次finalize( )方法,所以每个对象也只可能"复苏"一次。 
    13.finalize( )方法可以明确地被调用,但它却不能进行垃圾收集。 
    14.finalize( )方法可以被重载(overload),但只有具备初始的finalize( )方法特点的方法才可以被垃圾收集器调用。 
    15.子类的finalize( )方法可以明确地调用父类的finalize( )方法,作为该子类对象的最后一次适当的操作。但Java编译器却不认为这是一次覆盖操作(overriding),所以也不会对其调用进行检查。 
    16.当finalize( )方法尚未被调用时,System. runFinalization( )方法可以用来调用finalize( )方法,并实现相同的效果,对无用对象进行垃圾收集。 
    17.当一个方法执行完毕,其中的局部变量就会超出使用范围,此时可以被当作垃圾收集,但以后每当该方法再次被调用时,其中的局部变量便会被重新创建。 
    18.Java语言使用了一种"标记交换区的垃圾收集算法"。该算法会遍历程序中每一个对象的句柄,为被引用的对象做标记,然后回收尚未做标记的对象。所谓遍历可以简单地理解为"检查每一个"。 
    19.Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。