概念
终结器(Finalize),就是析构函数
,由波浪线(~
)和类名组成,不能被访问修饰符修饰。
- new 一个实例对象后,如果该类定义了 Finalize 方法,实例构造函数被调用前,会将本对象实例的指针放到终结器队列中,终结器队列是由垃圾回收器控制的数据结构。
- 需要进行垃圾回收时,终结器列表中的不可达对象会被移动到 freachable 队列,对于没 Finalize 方法的对象会先被垃圾回收器处理掉。
- 会有个专门的线程去调用 freachable 队列中对象的 Finalize 方法,freachable 队列为空,该线程就会休眠,一旦队列有记录项时,线程就会被唤醒,将每一项从队列中移除并调用 Finalize 方法。
- freachable 队列就像是一个根集合,让对象变得可达,在下一次 GC 时,freachable 队列不再引用该对象,对象内存会被回收,经历两次垃圾回收才释放它们占用的内存。
- 实际情况中,由于对象可能会进入老一代中,垃圾回收次数就不止是两次。
注意
- 不要在 Finalize 方法中访问线程的本地存储。
- 在只有一个终结器线程情况下,可能多个 CPU 分配可终结对象,但只有一个线程执行 Finalize 方法,可能导致线程调用跟不上分配的速度,导致性能和伸缩性问题。