前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java魔法堂:finalize函数

Java魔法堂:finalize函数

作者头像
^_^肥仔John
发布2018-01-18 15:53:45
4510
发布2018-01-18 15:53:45
举报

一、finalize与GC                            

  在GC第一次进行可达性分析时会将不可达而且该对象所属类重写finalize方法finalize方法重未被执行过的对象追加到F-Queue当中,然后JVM会自动开启一个低优先级的守护线程Finalizer执行F-Queue中元素的finalize方法。此时可通过finalize方法重新将不可达对象与引用链关联起来,那么在GC第二次进行可达性分析时,则可逃离被回收的名单。

代码语言:javascript
复制
class FinalizeEscapeGC{
  public static FinalizeEscapeGC SAVE_HOOK = null;
  public void isAlive(){
     System.out.println("yes, i am still alive;");
  }

  @override
  protected void finalize() throws Throwable{
    super.finalize();
    System.out.println("finalize method executed!");
    FinalizeEscapeGC.SAVE_HOOK = this;
  }

  public static void main(String[] args) throws Throwable{
      SAVE_HOOK = new FinalizeEscapeGC();

      SAVE_HOOK = null;
      System.gc();
      Thread.sleep(500);
      if (SAVE_HOOK == null) SAVE_HOOK.isAlive();
      else System.out.println("no, i am dead :(");
            
      SAVE_HOOK = null;
      System.gc();
      Thread.sleep(500);
      if (SAVE_HOOK == null) SAVE_HOOK.isAlive();
      else System.out.println("no, i am dead :(");
  }
}

第一次成功通过finalize方法成功逃脱回收名单,但第二次因为finalize方法之前已经被调用过,因此不会在执行finalize方法,所以注定被回收了。

注意:finalizer线程执行每个对象的finalize方法时是非阻塞的,因此并不保证GC进行第二次标记时finalize方法执行完成。

二、在finalize方法中释放资源?                   

  说起finalize方法大家就会联想到析构函数,并希望像析构函数那样使用,然后什么资源释放收尾等工作都放在finalize方法中。其实这只是让C/C++程序员更容易转向Java阵营的妥协而已,大家最好还是忘记有这一个方法吧,通过try-catch-finally释放资源更有效。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-02-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档