如果一个类重写了object的finalize方法,jvm会将这个类生成的实例加入到Finalizer的链表里,这个大家都比较好理解,目的是为了让jvm去invoke实例的finalize方法。但是如果你重写了object的finalize方法,但是finalize方法是空的,情况又是如何呢,下面我们结合jprofile,简单做一下测试。
写两个类,MyName类只有一个say方法,Test类每隔10s生成10万个MyName的实例。
package test;
public class MyName {
public String say() {
return "hello";
}
}
package test;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 10000000; i++) {
if (i % 1000000 == 0) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
MyName a = new MyName();
a.say();
}
System.out.println("end");
}
}
用jprofile运行上面的代码,观察jprofile提供的视图,没有发现内存中有Finalizer的链表数据。
然后我们修改MyName 类,重写object的finalize方法,但方法体为空。
package test;
public class MyName {
@Override
protected void finalize() {
}
public String say() {
return "hello";
}
}
再次测试,发现内存中生成了和MyName实例几乎相同数量的Finalizer实例。
根据上面的例子,我们可以得出结论,虽然object的finalize方法也是空的方法体,但是只要object的子类重写了finalize方法,即使finalize的方法体和父类一样是空的,虚拟机也不会进行优化,依然会将子类生成的实例加入Finalizer链表中,等待被回收。