Java入门之了解JVM(29)

没错,当一个对象被定义为不可达的时候,这个对象唯一的救命稻草就是finalize()方法,例如可用通过重写Object的finalize()方法,在其内将其自身(this)赋值给其他存活的变量,既可逃出生天;

因为,当对象被GC定义为不可达过后,这时GC会进行第1次标记,随后根据这个对象的 finalize()是否被重写 或 finalize()是否已经被调用过 这两点进行判定;如果finalize()没有被重写,又或者finalize()虽然已经重写但在之前已经被执行过一次了,那么这时GC就不会再次执行finalize();换句话来说就是,对象自我拯救的机会只有一次

但若被第1次标记为不可达的对象实重写了finalize(),且之前没有被执行过,这是GC会将其放置到一个叫“F-Queue”的队列中,随后会启动一条Finalizer线程来去一一调用队列中对象的finalize();

这里需要打醒十二分注意,虚拟机是并不会保证每个对象的finalize()都顺利执行完的,原因是虚拟机需要保证Finalizer线程执行过程中不会进入死循环或某个finalize()需要花费长时间来执行的情况,所以就算重写finalize()方法也不要依赖其能够完成关闭资源的操作,因为可能不被执行或者是执行不完成的情况

推荐阅读