Java9垃圾回收方法finalize() 原理解析

2020-02-25 14:02:32刘景俊

上面可以看出:

Cleaner 是最终类 不能被重写, 内部方法基本以静态方法提供 掌握例子上面的方法即可

重点指出

static class State implements Runnable

如果直接在类中直接定义实现, 必须提供一个静态内部类 (强制),否者不能进行回收 原因(: 普通内部类 局部内部类 对于外部类有依赖(引用),无法真正实现内存的释放 ) 可以选择直接定义外部类 (较为复杂,需要传递清理引用 Cleanable)

什么时候被回收?

* 1. 注册的Object处于幻象引用状态

* 2. 显式调用 clean 方法

实际例子(模版)

public class CleaningExample extends Thread implements AutoCloseable {
  private final static Cleaner CLEANER = Cleaner.create();
  private final State state;
  private final Cleaner.Cleanable cleanable;
  
  public CleaningExample() {
    this.state = new State();
    this.cleanable = CLEANER.register(this, state);
  }

  @Override
  public void close() throws Exception {
    cleanable.clean();
  }
  
  @SuppressWarnings("resource")
  public static void main(String[] args) {
    while (true) {
      CleaningExample example = new CleaningExample();
    }
  }
  // 模拟业务请求
  @Override
  public void run() {
    System.out.println("数据库 海量 查询请求 ................");
  }
  // 清理模版
  class State implements Runnable {
    State() {
      System.out.println("<--- init --->");
    }
    @Override
    public void run() {
      System.out.println("<--- close --->");
    }
  }
}

实现基础

/**
   * Heads of a CleanableList for each reference type.
   */
  final PhantomCleanable<?> phantomCleanableList;

  final WeakCleanable<?> weakCleanableList;

  final SoftCleanable<?> softCleanableList;

  // The ReferenceQueue of pending cleaning actions
  final ReferenceQueue<Object> queue;

在CleanerImpl 类进行clearner类的最终实现,看以看到定义的这些个字段,基本上明确了 他的基本原理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。