finalization机制

162 阅读1分钟

介绍

当JVM在回收某个对象之前,总会先调用这个对象的finalize()方法。

finalize()继承自Object类,该方法允许在子类中被重写,用于在对象被回收时进行资源释放,通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件,套接字和数据库连接等。但是,每个对象的finalize()方法只会执行一次。

Object类中的finalize方法:

protected void finalize() throws Throwable { }

Java对象的三种状态

1.可触及的:从根结点开始,可以到达这个对象

2.可复活的:对象的所有引用都被释放,但是对象可能在finalize()复活,这要是对象有重写的finalize()方法,且没有执行过

3.不可触及的:对象的finalize()被调用,并且没有复活,那么就会进入不可触及状态,该状态的对象不可能再复活了,必死无疑了

finalize()方法复活对象举例

class ObjectRelive {
   public static ObjectRelive obj;

   @Override
   protected void finalize() throws Throwable {
      super.finalize();
      System.out.println("finalize method excuted.");
      obj = this;
   }

   @Override
   public String toString() {
      return "I am CanReliveObj.";
   }

   public static void invokeObjectRealive() throws InterruptedException {
      obj = new ObjectRelive();
      obj = null; //复活对象

      System.gc();//主动发起一次 GC
      Thread.sleep(500); //finalize 方法会由低优先级线程执行,此处进行等待

      if (obj == null) {
         System.out.println("obj is null.");
      } else {
         System.out.println("obj is not null.");
      }

      obj = null;
      System.out.println("第二次 GC.");
      System.gc();
      Thread.sleep(500);

      if (obj == null) {
         System.out.println("obj is null.");
      } else {
         System.out.println("obj is not null.");
      }
   }
}