Javafinalize()方法

示例

这是一个受保护的非静态的方法Object类。此方法用于在将对象从内存中删除之前对它们执行某些最终操作或清理操作。

根据文档,当垃圾回收确定不再有对该对象的引用时,垃圾回收器将在对象上调用此方法。

但是,不能保证finalize()如果对象仍然可以访问或者对象合格时没有垃圾回收器运行,则将调用该方法。这就是为什么最好不要依赖此方法。

在Java核心库中,可以找到一些用法示例,例如FileInputStream.java:

protected void finalize() throws IOException {
    if ((fd != null) &&  (fd != FileDescriptor.in)) {
        /* if fd is shared, the references in FileDescriptor
         * will ensure that finalizer is only called when
         * safe to do so. All references using the fd have
         * become unreachable. We can call close()
         */
        close();
    }
}

在这种情况下,如果以前没有关闭资源,则是关闭该资源的最后机会。

通常,finalize()在任何类型的应用程序中使用方法都被认为是不好的做法,应避免使用。

终结器并非旨在释放资源(例如,关闭文件)。当(如果!)系统堆空间不足时,将调用垃圾收集器。当系统的文件句柄不足或其他任何原因时,您不能依靠它来调用。

终结器的预期用例是用于将要回收的对象,以将某个即将发生的厄运通知其他对象。现在存在一个用于该目的的更好的机制-java.lang.ref.WeakReference<T>类。如果您认为需要编写一种finalize()方法,则应考虑是否可以使用WeakReference来解决相同的问题。如果那不能解决您的问题,那么您可能需要重新思考您的设计。

为了进一步阅读,这里是finalize()Joshua Bloch撰写的“ Effective Java”一书中有关方法的项目。