Java魔法堂:finalize函数

一、finalize与GC                            

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

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释放资源更有效。

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4269086.html  ^_^肥仔John

时间: 2024-12-09 00:09:54

Java魔法堂:finalize函数的相关文章

Java魔法堂:String.format详解

Java魔法堂:String.format详解   目录     一.前言    二.重载方法     三.占位符     四.对字符.字符串进行格式化     五.对整数进行格式化     六.对浮点数进行格式化     七.对日期时间进行格式化     八.其他转换符  九.总结   参考 一.前言 String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", "John&q

Java魔法堂:String.format详解 (转载)

Java魔法堂:String.format详解   目录 一.前言 二.重载方法 三.占位符 四.对字符.字符串进行格式化 五.对整数进行格式化 六.对浮点数进行格式化 七.对日期时间进行格式化 八.其他转换符   九.总结   参考 一.前言 String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", "John"); ,下面将笔记整理并记录下来. 二.重载方法 /

Java魔法堂:类加载器入了个门

一.前言 <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件——类加载器的相关信息,以便日后查阅.若有纰漏请大家指正,谢谢. 注意:以下内容基于JDK7和HotSpot VM. 二.类加载器种类及其关系 从上图可知Java主要有4种类加载器 1. Bootstrap ClassLoader(引导类加载器):作为JVM的一部分无法在应用程序中直接引用,由C/C++实现(其他JVM可能通过Java来实

【转】Java魔法堂:String.format详解

Java魔法堂:String.format详解   目录     一.前言    二.重载方法     三.占位符     四.对字符.字符串进行格式化     五.对整数进行格式化     六.对浮点数进行格式化     七.对日期时间进行格式化     八.其他转换符  九.总结   参考 一.前言 String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", "John&q

Think in java 笔记之 finalize() 函数

1. java垃圾收集机制概述 Java用new关键字生成的对象放在堆空间中,引用句柄则放在栈空间中.一个对象可以有多个引用.由于垃圾收集器的存在,对象是没有作用域的,引用句柄才有作用域.所以,当该对象的最后一个引用的作用域结束,或者该对象的最后一个引用指向了另一个对象或null,也就是说当该对象已经没有被任何引用句柄所引用的时候,该对象就可以被java垃圾收集器所回收了.回收发生的时间是不确定的,不过可以调用gc()方法通知jvm回收垃圾. 2. finalize()方法 它是object类的

Java魔法堂:类加载机制入门

一.前言 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序就开始运行了,但在运行之前总得先把Main.class及其所依赖的类加载到JVM中吧!本篇将记录这些日子对类加载机制的学习心得,以便日后查阅.若有纰漏请大家指正,谢谢! 以下内容均基于JDK7和HotSpot VM. 二.执行java的那刻   大家都知道通过java命令来启动JVM和运行应用程序,但实际的流程又是如何的呢? 1. 首先根据java后的运行模式配置项或<JAVA_H

Java魔法堂:注解用法详解——@SuppressWarnings(转)

一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“感叹号”就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWarnings("unused") 去除这些“感叹号”. 二. @SuppressWarings注解    作用:用于抑制编译器产生警告信息. 示例1——抑制单类型的警告: @SuppressWarnings("unchecked") public void addItem

Java魔法堂:自定义和解析注解

一.前言 注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然我们也可以按需求自定义一些注解,然后对其进行解析获取元数据,进而实现通过代码生成代码的操作. 二.自定义注解 只需通过 关键字@interface 即可自定义注解 // 标识注解(就是无属性的注解) public @interface AnnotationWithoutProperty{ } //

Java魔法堂:注解用法详解——@SuppressWarnings

一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“感叹号”就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWarnings("unused") 去除这些“感叹号”. 二. @SuppressWarings注解    作用:用于抑制编译器产生警告信息. 示例1——抑制单类型的警告: @SuppressWarnings("unchecked") public void addItem