finalize
protected void finalize()
                 throws Throwable
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup. 
The general contract of finalize is that it is invoked if and when the JavaTM virtual machine has determined that there is no longer any means by which this object can be accessed by any thread that has not yet died, except as a result of an action taken by the finalization of some other object or class which is ready to be finalized. The finalize method may take any action, including making this object available again to other threads; the usual purpose of finalize, however, is to perform cleanup actions before the object is irrevocably discarded. For example, the finalize method for an object that represents an input/output connection might perform explicit I/O transactions to break the connection before the object is permanently discarded. The finalize method of class Object performs no special action; it simply returns normally. Subclasses of Object may override this definition. The Java programming language does not guarantee which thread will invoke the finalize method for any given object. It is guaranteed, however, that the thread that invokes finalize will not be holding any user-visible synchronization locks when finalize is invoked. If an uncaught exception is thrown by the finalize method, the exception is ignored and finalization of that object terminates. After the finalize method has been invoked for an object, no further action is taken until the Java virtual machine has again determined that there is no longer any means by which this object can be accessed by any thread that has not yet died, including possible actions by other objects or classes which are ready to be finalized, at which point the object may be discarded. The finalize method is never invoked more than once by a Java virtual machine for any given object. Any exception thrown by the finalize method causes the finalization of this object to be halted, but is otherwise ignored. 

解决方案 »

  1.   

    简单点说就是jvm在执行垃圾回收时执行
      

  2.   

    理论上说finalize()是一定要执行的, 因为如果不执行finalize()的话, 对象占用的内存就没有被回收, 这样的程序是不健全的. 但由于程序员自己不能回收对象, 所以这是JVM的问题, 可以不去考虑. 不过, 反过来说, 手动调用finalize()并不能导致垃圾对象被回收.
      

  3.   

    java编程的两条原则
    1,永远不要指望finalize()一定会被执行
    2,永远不要指望依靠线程的优先级来实现线程的执行顺序或者说同步
      

  4.   

    垃圾回收器只知道释放那些经由new分配得来的内存,因此它不知道如何释放你这个对象所占用的“特殊”内存!为了因应这种情况,java提供了finalize()函数!~当来机回收器打算开始释放你的对象所占用的存储空间时,会先调用其finalize(),并且在下依次垃圾回收动作发生时才回收该对象所占用的内存!
    不过这中间有个潜伏的编程陷阱!,那就是java对象并不绝对会被垃圾回收器回收!因为java没有象C++那样的析构函数!总之,似乎只有在你通过java的非正常管道来分配内存,打算作一些类似c会做的事情的时候,才是使用finalize()的适当时候