当判断一个对象不可达后并不一定会被回收。当对象经过可达性分析后发现
没有相连的引用链,那它将被第一次标记并进行筛选,筛选条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者已经执行过finalize(),这虚拟机视为没有必要执行。
如果这个对象被判定为有必要执行finalize()方法,那么这个对象将放入F-Queue队列中,后续将在一个Finalizer线程里触发这个方法,Finalizer线程并不会等待方法运行结束。finalize()方法执行中可再次与其他对象建立链接,即可拯救自己。稍后GC将对F-Queue中的对象进行第二次标记,如果对象这个时候还被标记为不可达,基本上逃脱不了回收的命运。
finalize()方法运行代价高、不确定性大、无法保证对象的调用顺序,建议实际代码中不要使用。