日期:2014-05-20  浏览次数:20620 次

Java面试问题之二十一
请问finalize()方法在垃圾回收过程中的作用,它具有哪些特点?

答:当垃圾回收器将要释放无用对象的时候,先调用该对象的finalize()方法。如果在程序终止之前垃圾回收器始终没有执行垃圾回收操作,那么垃圾回收器将始终不会调用无用对象的finalize()方法。在Java的Object祖先类中提供了protected类型的finalize()方法方法,因此任何Java类都可以覆盖finalize()方法,在这个方法中进行释放对象所占资源的操作。

Java虚拟机的垃圾回收操作对程序完全是透明的,因此程序无法预料某个无用对象的finalize()方法何时被调用。另外,除非垃圾回收器认为程序需要额外的内存,否则它不会试图释放无用对象占用的内存。换句话说,当一个程序只占用了少量内存,没有造成严重的内存需求,于是垃圾回收器没有释放那些无用对象占用的内存,因此这些对象的finalize()方法方法还没有被调用,程序就已经结束了。

另外,需要非常注意的一点就是:程序即使显式调用了System.gc()或者Runtime.gc()方法,也不能保证垃圾回收操作一定执行,因此不能保证无用对象的finalize()方法一定被调用。

对象的finalize()方法具有以下特点:
(1)垃圾回收器是否会执行该方法以及什么时候执行这个方法,都是不能确定的。
(2)finalize()方法有可能使对象复活,使它恢复到可触及状态。
(3)垃圾回收器在执行finalize()方法时,如果抛出异常,垃圾回收器不会报告异常,程序继续正常运行。