0%

Object.finalize()

Object的finalize()方法什么时候被执行?

当垃圾回收器要宣告一个对象死亡时,至少要经过两次标记过程:

如果对象在进行可达性分析后发现没有和GC Roots相连接的引用链,就会被第一次标记。

GC会再判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。

如果对象覆盖finalize()方法且未被虚拟机调用过,那么这个对象会被放置在F-Queue队列中,并在稍后由一个虚拟机自动建立的低优先级的Finalizer线程区执行触发finalize()方法,但不承诺等待其运行结束。

执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。

Object.finalize()设计目的?

f对象逃脱死亡的最后一次机会。(只要重新与引用链上的任何一个对象建立关联即可。)但是不建议使用,运行代价高昂,不确定性大,且无法保证各个对象的调用顺序。可用try-finally或其他替代。

Object.finalize()使用场景

由于发生垃圾回收就会调用finalize(),所以它可以作为垃圾回收的监听回调。

在Android framework源码中BinderInternal实现了gc监听的功能,ActivityThread在gc发生时,如果当前内存不足时,则清理一些不必要的activity以释放内存。

再比如你调用了一些native的方法,可以要在finalize()里去调用C的释放函数。

参考