当finalize()
抛出异常的时候会被忽略。而且,对象的终结将在此停止,导致对象处在一种不确定的状态。如果另一个进程试图使用这个对象的话,将产生不确定的结果。通常抛出异常将会导致线程终止并产生一个提示信息,但是从finalize()
中抛出异常就不会。
我想实践一下finalize()
方法,能提供一个范例吗?
class LargeObject{ byte[] memory = new byte[1024*1024*4]; @Override protected void finalize() throws Exception { System.out.println("finalized"); }} public class FinalizeDemo{ public static void main(String[] args) { while (true) new LargeObject(); }}
代码清单1:实践finalize()
代码清单1中的代码写了一个FinalizeDemo
程序,重复地对largeObject
类实例化。每一个Largeobject
对象将产生4M的数组。在这种情况下,由于没有指向该对象的引用,所以LargeObject
对象将被GC回收。
GC会调用对象的finalize()
方法来回收对象。LargeObject
重载的finalize()
方法被调用的时候会想标准输出流打印一条信息。它没有调用父类的finalize()
方法,因为它的父类是Object
,即父类的finalize()
方法什么也不做。
编译(javac FinalizeDemo.java
)并运行(java FinalizeDemo
)代码清单1.当我在我的环境下(64位win7平台)使用JDK7u6来编译运行的时候,我看到一列finalized
的信息。但是在JDK8的环境下时,在几行finalized
之后抛出了java.lang.OutOfMemoryError
。
因为
finalize()
方法对于虚拟机来说不是轻量级的程序,所以不能保证你一定会在你的环境下观察到输出信息。