根搜索算法:这个算法的基本思路是通过一系列名为“GC roots”的对象作为起点,从这些节点开始向下搜索,搜索走过的路径称为引用连,当一个对象到GC roots没有任何引用链,则证明对象是不可用的。将被判定为可回收对象。不可达对象要被垃圾回收,至少要经历两次标记过程。第一次标记时执行finalize()方法,并做记号,第二次标记则不会再执行finalize()方法了。执行finalize()方法后,对象可能又变为可达对象,逃脱被垃圾回收的命运。
示例代码--周志明著 Java虚拟机
1 public class FinalizeEscapeGC { 2 3 public static FinalizeEscapeGC SAVE_HOOK = null; 4 public String name; 5 public FinalizeEscapeGC(String name) { 6 this.name = name; 7 } 8 public void isAlive() { 9 System.out.println("yes, i am still alive"); 10 } 11 @Override 12 protected void finalize() throws Throwable { 13 super.finalize(); 14 System.out.println("finalize method executed!"); 15 System.out.println(this.name); 16 FinalizeEscapeGC.SAVE_HOOK = this; 17 } 18 public static void main(String[] args) throws Throwable { 19 SAVE_HOOK = new FinalizeEscapeGC("abc"); 20 SAVE_HOOK =null; 21 System.gc(); 22 Thread.sleep(500); 23 if(SAVE_HOOK != null) { 24 SAVE_HOOK.isAlive(); 25 } else { 26 System.out.println("no, i am dead"); 27 } 28 29 SAVE_HOOK =null; 30 System.gc(); 31 Thread.sleep(500); 32 if(SAVE_HOOK != null) { 33 SAVE_HOOK.isAlive(); 34 } else { 35 System.out.println("no, i am dead"); 36 } 37 } 38 }
第21行,第一次垃圾回收,名为abc的FinalizeEscapeGC实例对象的finalize()方法执行,此时全局静态变量 SAVE_HOOK又重新指向了改对象,使得该对象“复活”,
第29行,再次切断引用链,30行,第二次垃圾回收,该对象的finalize()方法不会再执行了。该对象在堆中的空间被释放。