根搜索算法:这个算法的基本思路是通过一系列名为“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()方法不会再执行了。该对象在堆中的空间被释放。

posted on 2013-10-02 21:13  xuqiyu  阅读(3350)  评论(0编辑  收藏  举报