内存中的对象要被回收至少要经过两次标记才能被回收掉。
我们说过可达性分析法来判断一个对象是否还会被引用,此时即使该对象已经没有任何引用链了,但是该对象也不一定会被回收,这样的对象需要先进行一步筛选,而又不是所有处于该状态的对象都会经过筛选,进行筛选的条件是该对象是否有必要执行finalize()方法,如果该对象没有覆盖finalize()方法或者虚拟机已经执行过该对象的finalize()方法,此时虚拟机会认为该对象没有必要执行finalize()方法,会将该对象直接回收掉。
如果判断该对象有必要执行finalize()方法,将该对象放入一个叫做F-Queue的队列中,并且在稍后通过一个由虚拟机创建的低优先级的线程去执行它,即虚拟机去触发finalize()方法,并且虚拟机不会等待他执行结束。执行finalize()方法是该对象最后一次自救的机会,只要在finalize时将自己与引用链上的人也一个节点建立连接即可,这样就会被回收,否则在执行完finalize方法之后,GC垃圾回收器就会将F-Queue队列中的对象进行小规模的标记,然后回收掉。如果对象与任何一个节点建立了联系,就将自己移出了待回收的队伍。
(注意:之所以建立一个低优先级的线程去触发该方法,是因为finalize方法容易造成内存系统崩溃,一旦线程执行过慢或者发生死循环,F-Queue队列中的其他对象就会进入永久等待状态,甚至造成整个内存回收系统的崩溃。)
建议不要使用finalize方法,finalize方法过于危险,他的作用用其他代码同样可实现的更好。