黑马程序员技术交流社区

标题: finalize()的用途何在 [打印本页]

作者: 欧阳超    时间: 2011-10-9 08:27
标题: finalize()的用途何在
finalize()的用途何在
作者: 丁林    时间: 2011-10-9 08:44
本帖最后由 丁林 于 2011-10-9 09:03 编辑

类的Finalize方法,可以告诉垃圾回收器应该执行的操作,该方法从Object类继承而来。在从堆中永久删除对象之前,垃圾回收器调用该对象的Finalize方法。注意,无法确切地保证垃圾回收器何时调用该方法,也无法保证调用不同对象的方法的顺序。即使一个对象包含另一个对象的引用,或者在释放一个对象很久以前就释放了另一个对象,也可能会以任意的顺序调用这两个对象的Finalize方法。如果必须保证采用特定的顺序,则必须提供自己的特有清理方法。

作者: 成杰    时间: 2011-10-9 08:56
Java垃圾回收器的调用是由一个后台线程调用的,当内存中存在没有引用的对象时,jvm并不是立即运行垃圾回收器,因为多次运行垃圾回收器会带来不必要的资源浪费。一般是当内存中存在大量没有引用对象或服务器内存频临使用殆尽时垃圾回收器才启动进行垃圾回收,垃圾回收器的启动前必然首先去调用我们重写的finalize()方法去进行垃圾回收前的一些清理工作!所以上边的两个判断并不能保证在那个时间点垃圾回收器会执行!
在工作中,最好不要用。
作者: 石宗银    时间: 2011-10-9 17:39
Java垃圾回收器,会在不定时的调用 finalize(),,去检查一些对象是否还存在有效的引用,不存在即回收,存在,则跳过拉。。
作者: 朱元强    时间: 2011-10-9 17:48
finalize()是由JVM自动调用的,你可以用System.gc(),但JVM不一定会立刻执行,JVM感觉内存空间有限时,才会开始执行finalize(),至于新的对象创建个数和被收集个数不同是因为收集的对象只和JVM的垃圾收集策略有关。

作者: 黄新灵    时间: 2011-10-9 23:41
finalize方法是与java编程中的垃圾回收器有关系。即当一个对象变成一个垃圾对象时候,如果此对象的内存被回收,那么就可以调用系统中定义的finalize方法来完成。
当然,java的内存回收可以有jvm来自动完成,如果手动回收垃圾对象则可以使用finalize方法。。。
作者: 王家俊    时间: 2011-10-10 01:05
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。

Object 类的 finalize 方法执行非特殊性操作;它仅执行一些常规返回。Object 的子类可以重写此定义。

Java 编程语言不保证哪个线程将调用某个给定对象的 finalize 方法。但可以保证在调用 finalize 时,调用 finalize 的线程将不会持有任何用户可见的同步锁定。如果 finalize 方法抛出未捕获的异常,那么该异常将被忽略,并且该对象的终结操作将终止。

在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。

对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。

finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2