object类中finalize方法详解

89 阅读2分钟

1.概述

object类中的finalize方法是在对象被回收之前执行的方法。这个方法不可以被主动调用,只能由垃圾回收线程进行调用。也就是说,如果垃圾回收线程不执行finalize方法,这个方法可能永远都不会触发。同时,如果这个方法执行的性能如果很差,也会影响GC的效率。值得注意的是,在finalize方法中,是有机会复活这个对象的,复活值得是由可达性分析算法发现这个目标不可达,通过调用这个finalize方法以后,经过可达性分析,这个对象可达了。

2.对象的三种状态

这三种状态主要是由于finalize方法的产生而出现的。

2.1 可触及状态

这个对象存在于GCRoot的引用链中

2.2 可复活状态

对象在GCRoot的引用链中变为了不可达,但是有机会在finalize方法中被复活

2.3 不可触及状态

如果对象被调用了finalize方法,但是并没有回到GCRoot的引用链中,则这个对象就变成了不可触及的状态。无法被再次复活,因为finalize方法只能被执行一次

3.对象要被回收的两次标记过程

3.1 第一次标记

如果一个对象处于不可达的状态,则进行第一次标记

3.2 第二次标记

如果这个对象没有重写finalize方法或者finalize方法已经被执行过了,则进行第二次标记,标记这个对象为不可触及的状态(不可以复活)。
如果这个方法还没有被调用过且完成了重写,则finalizer线程会调用finalize方法,此时会进行第二次标记,如果执行finalize方法的时候,没有和GCRoot建立联系,则变为不可达状态。