finalize()方法解密

来源:互联网 发布:mac应用程序卸载不了 编辑:程序博客网 时间:2024/06/06 03:43

java垃圾回收器在回收对象之前,会自动调用此对象finalize()方法,不需要程序员调用。(但只会被自动调用一次,如果之前被调用过,就不会再次调用)

原理:如果类没有实现finalize()方法,当GC时,如果没有引用指向它,垃圾回收器会直接回收该对象。如果一个类实现了finalize()方法,当创建该类的对象的时候,会多创建一个Finalizer对象,指向刚创建的对象,并把此Finalizer对象加入Finalizer类内部静态链表中GC时,如果发现对象只被Finalizer对象引用,则将链表中对应Finalizer对象加入到Finalizer内部静态引用队列中(并从链表中删除),FinalizerThread后台线程不断从引用队列中取出Finalizer对象(并从队列中删除,如果没有则等待),执行Finalizer所指向对象的finalize()方法,并把指向对象的引用置为NULL,下次GC时,该对象才被回收。实现finalize()方法的对象被回收,至少需要2次GC(至少:在finalize()方法中实现自救),严重影响性能和内存。  finalize()方法不安全:如果一个对象的finalize()方法死循环,引用队列中的其他对象将永远处于等待状态。

如果finalize()方法抛出异常FinalizeThread继续执行。执行finalize()方法(FinalizeThread线程执行)的代码被放入try{}catch(Throwable){空}


原创粉丝点击