Java对象的绝地求生
一个Java对象的一生非常悲情,在需要时产生,在无用时消亡。当一个Java对象被可达性分析算法指明GC Roots到这个对象不可达时就宣告了这个对象即将面临被消亡的处境。 那么死亡是注定的吗?幸运的是它有一次“自救”的机会。当对象进行可达性分析后发现没有与GC Roots相连的引用链,那么它将被标记一次,然后进行一次筛选,条件是此对象是否有必要执行finalize方法,假设它这个对象没有重写finalize方法或者说这个方法已经调用过了,那么虚拟机就认为没有必要执行了。 当然如果被判定为有必要执行,那么虚拟机会将这些需要执行的对象放置在一个名为F-Queue的队列当中,然后一条由虚拟机建立的优先级低的线程去执行他们的finalize方法,但不保证一定会等待他们执行结束。原因是如果某个对象的finalize方法执行缓慢,或者更加极端的发生了死循环,将导致整个系统崩溃。 finalize方法是这些被即将消亡的对象唯一生存下来的机会,稍后收集器会对这个F-Queue中的对象进行第二次的标记,如果成功自救,那么在这次标记时它将被移出“即将回收”的集合,如果没有成功自救,那就在劫难逃,真的要被回....