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

来源:互联网 发布:qt编程快速入门 鲍忠贵 编辑:程序博客网 时间:2024/05/18 03:53

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

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买房子不给过户怎么办 布艺床头有味道怎么办 皮革床头爆皮了怎么办 皮包用酒精擦了怎么办 床头靠背皮掉了怎么办 真皮床头爆皮了怎么办 半裙拉链往下滑怎么办 误用三氧化二砷怎么办 情侣之间感情淡了怎么办 雪纺布料刮坏了怎么办 棉麻布料坏了怎么办 主板针脚弯了怎么办?能修吗? 脸颊两侧毛孔大还有黑头怎么办 脸颊和鼻子粗毛孔大怎么办 十二时辰对照五脏养生在国外怎么办 在学校接吻怕被看到怎么办 楼房圈梁被破坏了怎么办 买了农村的房子怎么办 邻居建房不用共用墙怎么办 腿被蚂蚁咬了怎么办 火车订2票不挨着怎么办 手机全变成英文该怎么办 这些旧电脑该怎么办用英语翻译 落水已把人救出该怎么办 手机落水后已开过机怎么办? 车被洪水冲走了怎么办 感到生活无聊无事可干怎么办 邻居不除排水沟影响到自己怎么办 开过光的玉碎了怎么办 一脚刹车踩到底怎么办 p53基因型cc型该怎么办 人不小心掉进火山怎么办 奥林巴斯相机相片被锁了怎么办 文明53格外的奢侈品怎么办 答应了要请客钱不够怎么办 在家里面着急没办法干活怎么办 1岁宝宝脾气暴躁怎么办 档案不在中国海峡人才市场怎么办 海丰西中街吃鸡钱包给拿了怎么办? 朝鲜成为经济强国中国怎么办 窗户上有哈气水怎么办