finalize方法是Object提供的一个特殊的方法,任何类均可重写它。该方法是在GC回收对象之时进行调用的,但是任何重写了finalize方法的类,其在创建对象之时JVM会自动创建一个类型为java.lang.ref.Finalizer的对象。Finalizer类的作用就是,在GC将要回收一个实现了finalize方法的类的引用对象时,VM会标记将要被处理的类的引用,并将它加入Finalizer对象的一个队列中,这个队列是静态的变量,也就是全局共享的。由此,可见一个明显的问题,就是不当的使用finalize方法会造成内存泄漏问题。
下面我们看看finalize方法引起内存泄漏的一个示例。
先创建一个带有finalize方法的普通类,如下:
public class AWithFinal {
public void doSomething() {
}
@Override
protected void finalize() {
System.out.println("-");
}
}
类很简单,我们就复写了Object的finalize方法,只打印一个符号以观察其调用情况。下面我们看看当使用到这个AWithFinal的类是,如何会产生内存泄漏问题。看下面代码:
public class Test1 {
public static void checkReferences() throws Throwable {
Class<?> finalizerCls = Class.forName("java.lang.ref.Finalizer");
Field queue