对象实例销毁

来源:互联网 发布:中国网络通俗歌手大赛 编辑:程序博客网 时间:2024/05/29 10:54

JAVA 对象销毁的过程

---RayC2009-09-02

类对象有一个protected方法 finalize ,这个方法可以被其他类覆盖。能一个对象被调用的特定的finalize 被称为那个对象的 finalizer 。在垃圾回收器回收一个对象时,JVM 将调用对象的 finalizer

         Finalizer 释放了不能被自动存储管理器自动释放的资源(比如文件句柄或者操作系统图形上下文)。在这种情况下,简单的回收对象使用的内存空间不能保证它拥有的资源被回收。

         JAVA编程语言没有确定 finalizer 调用的频率,但是它会在这个对象的存储被重用前被调用。同样,JAVA 编程语言也没有确定调用任何给定的对象的 finalizer. 如果在销毁期间一个没有捕获的异常被抛出,异常将被忽略,同时对象销毁的过程也将停止。

         在类对象中的Finalize 方法不主动执行。然而,任何类声明了 finalize 方法表明它们的 finalize 方法总是调用超类的 finalize 方法,也就是为了要调用超类的 finalize 方法才声明子类的 finalize 方法,这通常是一个好的实践。(和构造方法不一样,销毁器不自动调用超类的销毁器;这种调用必须显式声明,也就是在子类的 finalize方法中调用超类的 finalize 方法。)

         出与效率的考虑,实现上追踪了覆盖finalize 方法的类对象和用其他方式覆盖 finalize 方法的类对象,比如

1-1

protected void finalize() { super.finalize(); }

 

我们鼓励不去覆盖类对象的finalize 方法,但是更有效的去释放它们。

象其他方法一样,Finalize方法可能不被显式调用。然而这样做不影响对象最终的自动销毁。

JVM 推行随机的执行finalize方法。销毁器可能以任意的次序或者并发的被调用。

例如,如果一个不可销毁的循环链接对象组不可达,那么所有的对象将会一起变成可以销毁。最终,这些对象的销毁器将以任意的次序或者并发的销毁。如果自动存储管理器发现这些对象不可达,那么他们的存储将被释放。

译自 JVMSPECIFICATION 2.17.7 Finalization of Class Instances

 

 

原创粉丝点击