概念

终结器(Finalize),就是析构函数,由波浪线(~)和类名组成,不能被访问修饰符修饰。

  1. new 一个实例对象后,如果该类定义了 Finalize 方法,实例构造函数被调用前,会将本对象实例的指针放到终结器队列中,终结器队列是由垃圾回收器控制的数据结构。
  2. 需要进行垃圾回收时,终结器列表中的不可达对象会被移动到 freachable 队列,对于没 Finalize 方法的对象会先被垃圾回收器处理掉。
  3. 会有个专门的线程去调用 freachable 队列中对象的 Finalize 方法,freachable 队列为空,该线程就会休眠,一旦队列有记录项时,线程就会被唤醒,将每一项从队列中移除并调用 Finalize 方法。
  4. freachable 队列就像是一个根集合,让对象变得可达,在下一次 GC 时,freachable 队列不再引用该对象,对象内存会被回收,经历两次垃圾回收才释放它们占用的内存。
  5. 实际情况中,由于对象可能会进入老一代中,垃圾回收次数就不止是两次。

注意

  1. 不要在 Finalize 方法中访问线程的本地存储。
  2. 在只有一个终结器线程情况下,可能多个 CPU 分配可终结对象,但只有一个线程执行 Finalize 方法,可能导致线程调用跟不上分配的速度,导致性能和伸缩性问题。