如果finalize方法为空,jvm是否会将其加入回收列表?

如果一个类重写了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链表中,等待被回收。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值